【问题标题】:Select unrelated ids on relate / lookup table在相关/查找表上选择不相关的 id
【发布时间】:2013-03-30 18:42:53
【问题描述】:

我已经看到了各种各样的例子,但是我找不到一个明确的例子来说明如何在没有给定值的情况下使用关联 table_A_Btable_A 返回与 table_B 中的行不相关的所有行对于table_A.idtable_B.id。我能找到的最接近的匹配是:

  1. 获取与B 中的一个或多个行不相关但不知道B 中的哪个值是问题的A 列表。

  2. 获取与给定B 无关的A 列表。

  3. 获取A 的列表,其中逗号分隔的字段为不相关的B(我不确定我是否看到了这一点,但似乎可以扩展一个示例)。

  4. As 和 Bs 的列表彼此不相关,但没有表明哪个不相关。

我还可以获得所有潜在A_B 元组的列表:

SELECT A.id, B.id  FROM A
INNER JOIN B ON A.id <> B.id

并且我可以假设使用EXCEPT 解决方法之一(我认为)针对关联表,但所有尝试均不成功,我想一旦该连接返回数百万个潜在组合,它的效率将大大降低无论如何。

所以给定表格值:

A
id | name
 1 | X
 2 | y
 3 | z


B
id | name
 7 | e
 8 | f
 9 | g

A_B
id | a_id | b_id
 1 |    1 |    7
 2 |    1 |    8
 3 |    1 |    9
 1 |    2 |    7
 2 |    2 |    8
 1 |    3 |    7

是否有会返回的查询: 一个 |乙 2 | 9 3 | 8 3 | 9

甚至更好:

 A | B 
 y | g
 z | f
 z | g

或者这是自找麻烦?

【问题讨论】:

    标签: mysql foreign-keys set-operations


    【解决方案1】:

    从 A 和 B 之间的交叉连接开始以获得所有可能的对。然后对关系表进行左连接并选择不匹配的位置:

    select driver.aID, driver.bID
    from (select a.id as aID, b.id as bID
          from table_A A cross join table_B B
         ) driver left outer join
         table_A_B ab
         on ab.aID = driver.aID and ab.bID = bID
    where ab.aID is null
    

    这可行,假设 id 永远不会为 NULL。

    我没有测试过 SQL,所以它可能有语法错误。

    这个版本让你知道名字:

    select driver.aName, driver.bName
    from (select a.id as aID, b.id as bID, a.name as aName, b.name as Bname
          from table_A A cross join table_B B
         ) driver left outer join
         table_A_B ab
         on ab.aID = driver.aID and ab.bID = bID
    where ab.aID is null
    

    【讨论】:

    • 我尝试使用INNER JOIN A.id &lt;&gt; B.id 获取潜力的完整列表,但每次都失败。很高兴我在逻辑上有正确的想法,而且你知道如何把它带回家。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多