2017-06-17 132 views
0

想象三個數據表A,B和C A和B共享共同的可變ID1提取數據。 B和C共享一個公共變量ID2。寫一個僞查詢來得到這個結果:從表B中選擇一切,在表A和B中都有匹配的記錄,但在表C中沒有匹配記錄。SQL查詢來從三個表基於多個條件

我的答案版本在下面(但我不確定它是否正確):

Select * 
From table_b 
Left Join table_a 
On table_b.ID1 = table_a.ID1 
Where table_b.ID2 NOT IN table_c.ID2 

我非常懷疑Where條件是否適用於給定條件?請對我的回答給出您的意見。謝謝!

+0

你的答案是沒有語法正確。 –

回答

1
Select * 
From table_b 
Left Join table_a On table_b.ID1 = table_a.ID1 
Where not exists (select * from table_c where table_c.ID2 = table_b.ID2) 
0

類似IngoB的解決方案,但稍微更可讀的(恕我直言)

SELECT * 
FROM table_b 
LEFT OUTER JOIN table_a USING (id1) 
WHERE id2 NOT IN (SELECT id2 FROM table_c) 
+0

它取決於正在使用的數據和數據庫平臺,但NOT EXISTS方法可以比NOT IN執行得更好。對於SQL Server,請參閱此答案https://stackoverflow.com/questions/173041/not-in-vs-not-exists – Nathan

+0

哪種解決方案更快 - 如果根本不同 - 很大程度上取決於數據的分佈和兩個表的索引。上次我在Oracle上看到這種情況時,優化器總是爲這兩種變體提供相同的執行計劃。 – fhossfel

+0

*重要提示:*如果TABLE_C.ID2中沒有NULL值,我的解決方案僅與IngoB等效。我認爲這是一個PK列,因此不會有NULL值,但如果不是這樣的話,Ingo的解決方案是正確的。 – fhossfel