1

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

我有以下 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 语法不是很有经验,尽管看了一整天也找不到答案。

4

1 回答 1

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
于 2015-11-24T18:45:50.410 回答