2017-05-25 82 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