我是SQL的新手并且难以正确地获得此查询。简化,我的表结构如下:
Table A:
aId primary key
Table B:
bId primary key
Table A_B:
aId foreign key A(aId)
bId foreign key B(bId)
我想创建一个SQL查询,告诉我A
和B
的哪些组合未在链接表A_B
中表示。此外,每个组合只应显示一次。
以下是我尝试过的查询,但都不起作用。在将行添加到链接表之后,所有这些都开始重复组合。
SELECT A.aId, B.bId
FROM A JOIN B JOIN A_B
WHERE (A.aId!=A_B.aId OR B.bId!=A_B.bId)
SELECT A.aId, B.bId
FROM A LEFT JOIN B LEFT JOIN A_B
WHERE (A.aId!=A_B.aId OR B.bId!=A_B.bId)
SELECT A.aId, B.bId
FROM A JOIN B JOIN A_B
WHERE (A.aId!=A_B.aId AND B.bId!=A_B.bId)
我该如何做到这一点?
另外,一个解释和解决方案将非常感激 - 可能很明显,我还没有完全围绕连接。
答案 0 :(得分:2)
使用这些WHERE,您正在检查任何行的组合是否具有这些值。
然而,“没有代表”是不同的东西;你真的想检查所有行是否没有这些值。
这需要像EXISTS这样的运营商:
SELECT A.aId, B.bId
FROM A CROSS JOIN B
WHERE NOT EXISTS (SELECT 1
FROM A_B
WHERE aId = A.aID
AND bId = B.bID)