Sql查询找到两个表之间没有关系

时间:2017-05-25 05:20:14

标签: sql sql-server

我正在尝试编写一个查询,发现表C和表A之间没有关系。唯一知道这种关系的表是表B.

|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|

希望你能遵循这一点。我一直在想着它,我没有看到解决方案。

4 个答案:

答案 0 :(得分: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没有这个功能。

答案 1 :(得分: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

答案 2 :(得分: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

答案 3 :(得分: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;