MySQL динамически определяет табель для использования с внутренним объединением - PullRequest
4 голосов
/ 15 июня 2010

Он, ребята, я застрял с проблемой, и я надеюсь, что кто-то может мне помочь. У меня свидание. Например 2009-10-1. Эта дата используется, чтобы проверить, в какое время года я работаю. Это может быть лето или зима.

Если летом будет таблица для внутреннего соединения, то будет "summer09_rooms". Если зима 'winter09_rooms'. Поэтому я в основном хочу сделать СЛУЧАЙ, КОГДА В МОЕМ ВНУТРЕННЕМ СОЕДИНЕНИИ. Как это сделать? Запрос будет выглядеть так:

SELECT name, arrival_date, departure_date FROM holliday a
INNER JOIN 
(
CASE when arrival_date BETWEEN 2009-10-1 AND 2009-4-1 THEN summer09_rooms b 
ELSE winter09_rooms b END
)
ON a.dossier=b.dossier

Конечно, этот запрос не работает, но теперь я надеюсь, что вы увидите, чего я хочу достичь.

С уважением,

Цифровой человек

Ответы [ 3 ]

1 голос
/ 15 июня 2010

Если у вас нет перекрывающихся дат в ваших летних и зимних таблицах, вы можете объединить обе таблицы, чтобы получить требуемый результат (я предполагаю, что они имеют одинаковое расположение).

SELECT  name
        , arrival_date
        , departure_date 
FROM    holliday a
        INNER JOIN (
          SELECT * FROM summer09_rooms
          UNION ALL SELECT * FROM winter09_rooms
        ) b ON a.dossier = b.dossier

Это оставляет вопрос, хотя почему у вас будут две таблицы на первом месте.

1 голос
/ 15 июня 2010
SELECT 
name, 
CASE when arrival_date BETWEEN 2009-10-1 AND 2009-4-1 THEN
s.arrival_date else w.arrival_date end as arrival_date,
CASE when arrival_date BETWEEN 2009-10-1 AND 2009-4-1 THEN
s.departure_date  else w.departure_date  end as departure_date 

FROM holliday a
left JOIN summer09_rooms s on a.dossier=s.dossier and s.arrival_date BETWEEN 2009-10-1 AND 2009-4-1
left JOIN winter09_rooms w on a.dossier=w.dossier and NOT w.arrival_date BETWEEN 2009-10-1 AND 2009-4-1

Таким образом, вы получите все результаты праздников, в которых есть соответствующие досье летом или зимой.

1 голос
/ 15 июня 2010

Я не думаю, что вы можете присоединиться таким образом.Два возможных обходных пути, которые приходят на ум, - это использовать подвыборы вместо внутреннего объединения или объединить обе таблицы в зависимости от условия (например, INNER JOIN summer09_rooms b ON arribal_date BETWEEN .... AND a.dossier = b.dossier INNER JOIN winter09_rooms ...)

...