如何将子查询包含到内部联接中?

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 是正确的。我只是按照你那里的东西去做。因此,是的,您只能引用从该派生表中提取的该派生表中的列。

以上是关于如何将子查询包含到内部联接中?的主要内容,如果未能解决你的问题,请参考以下文章

带有子查询的 Oracle 更新 - 性能问题

带有内部联接和子查询的 Microsoft Access 更新语句

哪个查询更有效?内部联接与子查询?总和案例与拥有

使用子查询与派生表进行内部联接

如何将子查询的值存储到 Hana Studio 中的变量中?

BigQuery:使用子查询和内部联接的计数更新行