SQL查找缺少的链接表行

时间:2014-11-28 20:56:03

标签: sql sqlite join

我是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查询,告诉我AB的哪些组合未在链接表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)

我该如何做到这一点?

另外,一个解释和解决方案将非常感激 - 可能很明显,我还没有完全围绕连接。

1 个答案:

答案 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)