如何将子查询包含到内部联接中?
Posted
技术标签:
【中文标题】如何将子查询包含到内部联接中?【英文标题】:How can I include a subquery into an inner join? 【发布时间】:2016-02-26 07:37:57 【问题描述】:
我有以下 SQL:
SELECT
date_trunc(
'hour',
FROM_UNIXTIME(timefrom)
) AS HourFrom,
date_trunc(
'hour',
(FROM_UNIXTIME(timeto) + interval '45' minute)
) AS HourTo
FROM
reservation
ORDER BY
date_trunc(
'day',
FROM_UNIXTIME(timefrom)
)
这给了我这样的数据:
TimeFrom TimeTo
2015-08-04 11:00:00.000 2015-08-04 14:00:00.000
2015-08-04 18:00:00.000 2015-08-04 20:00:00.000
2015-08-04 21:00:00.000 2015-08-04 23:00:00.000
我想要一个数字表并进行如下内部联接:
SELECT DATE_ADD(HOUR, i - 1, TimeFrom) AS TimeFrom,
DATE_ADD(HOUR, i, TimeFrom) AS TimeTo
FROM (SELECT 1 AS i UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4
UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8
UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12
UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL SELECT 15 UNION ALL SELECT 16
UNION ALL SELECT 17 UNION ALL SELECT 18 UNION ALL SELECT 19 UNION ALL SELECT 20
UNION ALL SELECT 21 UNION ALL SELECT 22 UNION ALL SELECT 23 UNION ALL SELECT 24
) AS numbers
INNER JOIN mytable ON numbers.i <= DATE_DIFF(HOUR, TimeFrom, TimeTo)
ORDER BY TimeFrom
所以我可以得到这样的东西:
TimeFrom TimeTo
2015-08-04 11:00:00.000 2015-08-04 12:00:00.000
2015-08-04 12:00:00.000 2015-08-04 13:00:00.000
2015-08-04 13:00:00.000 2015-08-04 14:00:00.000
2015-08-04 18:00:00.000 2015-08-04 19:00:00.000
2015-08-04 19:00:00.000 2015-08-04 20:00:00.000
2015-08-04 21:00:00.000 2015-08-04 22:00:00.000
2015-08-04 22:00:00.000 2015-08-04 23:00:00.000
如何使用第一个查询的结果进行内部连接(将 mytable 替换为该查询结果)?这可能吗?我一直无法找到一种方法来插入我的查询以对其执行内部联接。
我对 SQL 语法不是很有经验,尽管看了一整天也没能找到答案。
【问题讨论】:
您的第二个查询就在那儿...您就是这样做的。也就是说,您将整个 select 语句放在括号中,并为其命名。不过,不要放 AS。只需在名称前留一个空格即可。该记录集将被视为表格。 @durbnpoisn 你能发布一个答案吗?您应该为自己的回答而不是别人的功劳 @durbnpoisn 给个名字是什么意思? 添加答案以澄清。 【参考方案1】:您要做的是创建一个“派生表”。也就是说,从其他东西派生的表。大多数时候它是一个视图。但它可以用典型的 SELECT 语句来完成。语法如下:
SELECT dt.name
from (SELECT name from tableWithName) dt
其中“dt”是表的名称。在主选择中引用它时,必须使用派生表名作为前缀。 “dt.name”
您在此处的第二个查询实际上已经正确设置。但是 AS 这个词的语法不正确。它应该只是说
...SELECT 24
) numbers
您在开始的 SELECT 中的所有部分都应该使用该表名作为前缀:
SELECT DATE_ADD(HOUR, i - 1, numbers.TimeFrom) AS TimeFrom
【讨论】:
对于最后一行,你想要DATE_ADD(HOUR, i - 1, myTable.TimeFrom) AS TimeFrom
,或者类似的东西。基本上,numbers
没有TimeFrom
。
@JulienBlanchard 是正确的。我只是按照你那里的东西去做。因此,是的,您只能引用从该派生表中提取的该派生表中的列。以上是关于如何将子查询包含到内部联接中?的主要内容,如果未能解决你的问题,请参考以下文章
带有内部联接和子查询的 Microsoft Access 更新语句