【问题标题】:Finding rows that do not have a corresponding entry in join table查找连接表中没有对应条目的行
【发布时间】:2016-06-14 14:19:25
【问题描述】:

我有一个表 A,它通过连接表 J 连接到另一个表 B。如何根据给定的属性访问表 A 中在 J 中没有相应“连接”条目的所有行表B?例如:

Table A:
-------
id

Table J:
-------
A_id
B_id

Table B:
-------
id
name

假设对于给定的 B.name = "Suzie",我们如何确定在 J 中没有 B_id 且 B.name = "Suzie" 的条目的所有行 A?我觉得这应该是一个简单的查询,我考虑使用 GROUP BY 因为似乎对于 A 中的每个条目,您都想确定您正在使用的 B_id (其中 B.name = "Suzie"这种情况)对于 A_id 的每个“组”都存在于 J 中。不知何故,我无法解决这个问题;希望能朝着正确的方向前进。

【问题讨论】:

    标签: sql sqlite activerecord


    【解决方案1】:

    您可以使用WHERE NOT EXISTS

    Select  A.*
    From    TableA  A
    Where Not Exists
    (
        Select  1
        From    TableJ  J
        Join    TableB  B   On  B.id = J.B_id
        Where   J.A_id = A.id
        And     B.Name = 'Suzie'
    )
    

    【讨论】:

    • 我认为使用EXISTS() 时最好写SELECT 1,因为更清楚的是,内部选择的列在任何地方都不需要。
    • 没错,这确实消除了EXISTS 语句的一些歧义。
    【解决方案2】:

    我相信另一种方法是在连接表上执行LEFT OUTER JOIN,但另一个ON 条件是J.b_id 是所需“名称”的b.id。因此,您可以检索A 中具有或不具有对应B 项目的所有项目。

    SELECT A.*
    FROM A 
    LEFT OUTER JOIN J 
    ON J.a_id = a.id AND J.b_id IN
      (SELECT id FROM B where B.name "Suzie")
    WHERE J.a_id IS NULL
    

    想知道关于性能的任何想法吗?

    【讨论】:

      猜你喜欢
      • 2021-07-09
      • 1970-01-01
      • 2021-12-21
      • 1970-01-01
      • 2017-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多