2012-09-21 157 views
1

即使簡單的JOIN查詢仍然存在困難。從我最後一個問題,Simple but nested SELECT query,我學到了很多東西,但仍然無法完成我的JOIN查詢。 :(簡單的SQL JOIN查詢

我從last question此查詢,它的工作:

SELECT c.value, d.value 
FROM a 
LEFT JOIN b 
    ON a.id = b.idy 
LEFT JOIN c 
    ON b.idx = c.id 
LEFT JOIN d 
    ON b.idx = d.id 
WHERE a.name = "test" 

現在,我想另一個條件添加到查詢一下表上e,f,g,如果任何的a.id, b.idx, c.id, d.id存在於表e,f,g,然後返回結果。例如,如果存在於e.idc.id那麼它應該從表c消除了行。如果存在於g.ida.id,它不應該,因爲繼續,如果你脫下a.id從查詢中,其他部分不應該返回任何東西。

我做了一個樣本數據庫結構,你可以看到SQL代碼在這裏:Sample.sql

回答

2

你的意思是這樣的嗎?

SELECT c.value, d.value 
FROM a 
LEFT JOIN b 
    ON a.id = b.idy 
    AND b.id NOT IN (SELECT e.id FROM e UNION ALL SELECT f.id FROM f UNION ALL SELECT g.id FROM g) 
LEFT JOIN c 
    ON b.idx = c.id 
    AND c.id NOT IN (SELECT e.id FROM e UNION ALL SELECT f.id FROM f UNION ALL SELECT g.id FROM g) 
LEFT JOIN d 
    ON b.idx = d.id 
    AND d.id NOT IN (SELECT e.id FROM e UNION ALL SELECT f.id FROM f UNION ALL SELECT g.id FROM g) 
WHERE a.name = "test" 
AND a.id NOT IN (SELECT e.id FROM e UNION ALL SELECT f.id FROM f UNION ALL SELECT g.id FROM g) 
+0

是的,但我要測試!我的SQL知識很糟糕:( – Mahdi

+0

嘿,它的工作原理,但是當我在'f'中有例如'c.id'時,它會返回'c.value,d.value'的'NULL'值。順便說一下我希望它只返回'NULL'爲'c.value'或至少'0'行不是'NULL'值。這是可能的嗎? – Mahdi

+0

它的作品好男人!謝謝你的幫助!:) – Mahdi

2

不知道你的SQL方言,但與MySQL你可以使用:

AND NOT EXISTS(SELECT 1 FROM e WHERE e.idx = b.idx) 
+0

謝謝!爲什麼選擇1?我可以使用'選擇空'?一樣的? – Mahdi

+2

_exists_檢查是否存在至少一行,所以你可以選擇任何東西,也包括空值 – mauhiz

+0

,請使用@lc的答案,這實際上比我的更準確^^; – mauhiz