在关联/查找表中选择不相关的ID

时间:2013-03-30 18:42:54

标签: mysql foreign-keys set-operations

我已经看到了各种各样的示例,但我找不到一个明确的示例,说明如何使用涉及{{1}从table_A返回与table_B中的行无关的所有行没有table_A_Btable_A.id的给定值。我能找到的最接近的匹配是:

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

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

  3. 获取B的列表,其中包含逗号分隔的无关A字段(不确定我是否看到过,但似乎有一个例子可能会扩展)。

    < / LI>
  4. BA的列表彼此无关,但没有说明哪一个与另一个无关。

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

    A_B

    我可以假设使用其中一个SELECT A.id, B.id FROM A INNER JOIN B ON A.id <> B.id 解决方法(我认为)对照关联表,但所有尝试都没有成功,我想一旦这个连接返回了数百万个潜在的组合,它将会很多效率低下无论如何。

    所以给出了表值:

    EXCEPT

    是否有返回的查询:      A |乙      2 | 9      3 | 8      3 | 9

    甚至更好:

    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
    

    或者这是在寻找麻烦吗?

1 个答案:

答案 0 :(得分:3)

从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