2013-03-30 38 views
1

我已經看到了這個的各種示例,但是我找不到一個明確的示例,說明如何從table_A返回與table_B中的某一行無關的所有行,而不使用關聯table_A_B給定值爲table_A.idtable_B.id。我能找到這個最接近配襯是:在關聯/查找表上選擇不相關的ID

  1. 獲取不相關的一行或多行中B但不知道其中B中值是問題的A列表。

  2. 獲取與給定B無關的A的列表。

  3. 使用以逗號分隔的無關字段B獲得列表A(不確定我看到了這一點,但它看起來像一個示例可能會展開)。

  4. A s和B的列表彼此不相關,但沒有表明哪一個與另一個不相關。

我還可以得到所有可能的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 

是否有將返回的查詢: A | B 2 | 9 3 | 8 3 | 9

甚至更​​好:

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

或者這自找麻煩?

回答

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 
+0

我試着用'INNER JOIN A.id <> B.id'獲得潛能的完整列表,但它動輒失敗。很高興我從邏輯上理解了正確的想法,並且知道如何把它帶回家。謝謝! – Anthony