我已经看到了各种各样的示例,但我找不到一个明确的示例,说明如何使用涉及{{1}从table_A
返回与table_B
中的行无关的所有行没有table_A_B
或table_A.id
的给定值。我能找到的最接近的匹配是:
获取与table_B.id
中的一行或多行无关的A
列表,但不知道B中的哪个值是问题。
获取与B
无关的A
列表。
获取B
的列表,其中包含逗号分隔的无关A
字段(不确定我是否看到过,但似乎有一个例子可能会扩展)。
B
和A
的列表彼此无关,但没有说明哪一个与另一个无关。
我还可以获得所有潜在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
或者这是在寻找麻烦吗?
答案 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