多对多关系 - 选择所有A,但链接到B的除外

时间:2018-02-23 06:11:17

标签: sql sqlite join many-to-many

我的数据库中的项AB之间存在多对多关系

     A                B               A_B_Join
============     ============     ===============
 Id  |  ...       Id  |  ...       A_Id  |  B_Id
------------     ------------     ---------------
  0  |  ...        5  |  ...          0  |  5
  1  |  ...        6  |  ...          0  |  7
  2  |  ...        7  |  ...          1  |  5
  3  |  ...        8  |  ...          1  |  6
                                      2  |  6
     :                :               2  |  7
     :                :               3  |  7
                                      3  |  8
                                      3  |  5

我试图举例说明,所有A来自任意列表的B都没有[7, 8],例如SELECT A.* FROM A INNER JOIN A_B_Join ON A.id=A_B_Join.A_id WHERE A_B_Join.B_Id NOT IN (:BIds)

到目前为止我所做的不正确的是:

BIds

其中[7, 8]是我的列表A。但是,这并不完全正确,因为它仍会选择那些不具有B_id

中指定的相应BIds值的特定Query

我尝试过搜索类似于我的问题的示例和解决方案,但我不确定这种类型的print ("untf frame",self.view.convert(usernameTextField.frame, to: self.view ) ) print ("pwtf frame",self.view.convert(passwordTextField.frame, to: self.view ) ) 是什么。我将不胜感激任何帮助或指出任何重复的问题

2 个答案:

答案 0 :(得分:1)

您可以使用NOT EXISTS内部查询将获得A7的所有8,但自NOT EXISTS使用以来,它将显示{{1}的所有行1}}在内部查询中不存在。

A

答案 1 :(得分:1)

一种方法使用左反连接:

SELECT a.*
FROM A a
LEFT JOIN A_B_Join j
    ON a.id = j.A_Id AND j.B_Id IN (7, 8)
WHERE
    j.A_Id IS NULL;

请注意,这将包含所有 A记录,这些记录与(7,8)中的B_Id不匹配。这将包括A记录,实际上这些记录在联结表中根本不加入任何内容。如果需要,我们可以将此逻辑更改为仅包含不在(7,8)中的匹配。