2017-05-25 77 views
1

我想寫一個查詢,發現表C和表A之間沒有關係。知道這種關係的唯一表是表B.SQL查詢找到兩個表之間沒有關係

|Table A| |Table B|      |Table C| 
--------- ---------      --------- 
|id: 1 | |id: 2, a_id: 1, c_id: 3|  |id: 3 | 
|id: 4 |         |id: 5 | 

對於表C中與表A無關的每個條目,我想知道它。

輸出示例:

|Output| 
-------- 
|c_id: 3, a_id: 4| 
|c_id: 5, a_id: 1| 
|c_id: 5, a_id: 4| 

希望你可以遵循。我一直在考慮這個問題,但我沒有看到解決方案。

回答

2

做交叉聯接AC之間,使用NOT EXISTS子句排除在B中發現的組合。

SELECT C.id AS c_id, A.id AS a_id 
    FROM C, A 
WHERE NOT EXISTS (SELECT * FROM B WHERE B.a_id = A.id AND B.c_id = C.id) 

既然你標記sql-server,你也可以使用EXCEPT條款。

SELECT C.id AS c_id, A.id AS a_id FROM C, A 
EXCEPT 
SELECT c_id, a_id FROM B 

第一個適用於所有SQL數據庫。第二種僅適用於某些例如

  • EXCEPT適用於MS SQL Server,PostgreSQL,DB2和SQLite。
  • MINUS適用於Oracle。
  • MySQL沒有該功能。
0

嘗試左移找到空值

select A.id, C.id 
from B left outer join A on A.id= B.a_id left outer join C on C.id = B.c_id 
where B.a_id is null or B.c_id is null 
0

這應該爲你做加盟。

SELECT c.id, a.id 
FROM c 
    JOIN a 
WHERE (SELECT id 
    FROM b 
    WHERE b.a_id = a.id AND 
    b.c_id = c.id) IS NULL 
ORDER BY c.id, a.id; 
2

試試這個

SELECT C.id AS c_id, A.id AS a_id 
FROM C cross join A left outer join b on B.a_id = A.id AND B.c_id = C.id 
WHERE b.id is null