2015-11-24 5 views
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 и не смог найти ответ для этого, несмотря на то, что весь день смотрел.

+1

Второй Querry вы имеете право там ... Вот именно так, как вы сделай это. То есть вы помещаете оператор ENTIRE select в parens и даете ему имя. Однако не ставьте AS. Просто оставьте пробел перед именем. Этот набор записей будет рассматриваться как таблица. – durbnpoisn

+0

@durbnpoisn вы могли бы написать ответ? Вы должны взять кредит за свой ответ, а не кто-то еще – davejal

+0

@durbnpoisn, что вы имеете в виду дать имя? – Javier

ответ

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 
+0

Для этой последней строки вы хотите «DATE_ADD (HOUR, i-1, myTable.TimeFrom) AS TimeFrom' или что-то в этом направлении. В принципе, 'numbers' не имеет' TimeFrom'. –

+0

@JulienBlanchard верен. Я просто проходил мимо того, что у вас было. Итак, да, вы можете ссылаться только на столбцы из этой производной таблицы, которые извлекаются из этой производной таблицы. – durbnpoisn