Объединения на основе условий в нескольких таблицах - PullRequest
1 голос
/ 29 ноября 2011

Три таблицы, столбцы следующим образом:

A:   A_id, B_id, C_id, flag, ...
B:   B_id, date, ...
C:   C_id, date

Если A.flag равен NULL, то мне нужно, чтобы все строки из A были объединены с B на B_id, у которых B.date в прошлом.

Если A.flag не равен NULL, тогда мне нужно, чтобы все строки из A, соединенные с B на B_id, имели C.date в прошлом, а C соединялся на C_id.

Попытка:

SELECT *
FROM A, B, C
WHERE A.A_id = B.B_id
AND ((A.flag IS NULL AND (NOW() > B.date) OR
     (A.flag IS NOT NULL AND (NOW() > C.date) AND C.C_id = A.C_id))

Но мне нужно некоторое условие в строке A.flag is NULL, чтобы оно не соединялось с каждой строкой из C. Это то, что я не могу решить.

Или есть более простой способсделать это?

Ответы [ 3 ]

3 голосов
/ 29 ноября 2011

Вы можете попробовать

SELECT a.*, b.* 
FROM a INNER JOIN b ON a.B_id = b.B_id
WHERE a.flag IS NULL AND b.date < NOW()
UNION
SELECT a.*, b.* 
FROM a INNER JOIN b ON a.B_id = b.B_id
INNER JOIN c ON a.C_id = c.C_id
WHERE a.flag IS NOT NULL AND c.date < NOW()
0 голосов
/ 29 ноября 2011

Нечто подобное может сработать:

SELECT *
FROM A

WHERE A.flag IS NULL
  AND EXISTS (SELECT * FROM B WHERE date < NOW() AND B_id = A.A_id)

   OR A.flag IS NOT NULL
  AND EXISTS (SELECT * FROM C WHERE date < NOW() AND C_id = A.A_id)
0 голосов
/ 29 ноября 2011

это, вероятно, поможет вам!

SELECT a.*
FROM A AS a
LEFT JOIN B AS b ON b.b_id = a.b_id AND NOW() > b.date AND a.flag IS NULL
LEFT JOIN C AS c ON c.c_id = a.c_id AND NOW() > c.date AND a.flag IS NOT NULL

Если вам нужны только строки из A, соответствующие любому из этих критериев, вам нужно добавить где-то вроде этого:

WHERE b.b_id IS NOT NULL OR c.c_id IS NOT NULL

В противном случае вы получите все строки в A.:)

Полный запрос будет выглядеть так:

SELECT a.*
FROM A AS a
LEFT JOIN B AS b ON b.b_id = a.b_id AND NOW() > b.date AND a.flag IS NULL
LEFT JOIN C AS c ON c.c_id = a.c_id AND NOW() > c.date AND a.flag IS NOT NULL
WHERE b.b_id IS NOT NULL OR c.c_id IS NOT NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...