2011-11-29 18 views
1

三個表,列如下:加入基於在多個表中的條件

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_id上的B在過去具有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

你可以嘗試

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

你這可能會做的伎倆!

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 
0

像這樣的東西可能會奏效,以及:

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

這是相當整潔,但我需要我的結果集包含從B列。 – jontyc