2016-05-23 83 views
3
的分區

SQL Server 2008的加入只有兩個表

表A的樣子:

A_ID v1 v2 v3 
--------------------------- 
1 d e f 
1 a b c 
1 a b d 
2 d a b 
2 e f g 
3 d e f 
3 e f g 
3 d a b 

和表B是類似的:

B_ID v1 v2 v3 
--------------------------- 
Q a b c 
Q b a c 
Q a b d 
R d e f 
R a b c 
R d e f 
P e f g 
P d a b 

我需要從這兩個表背是(A_ID,B_ID)對(如果有的話),其中B_ID =任何一個值的表B中的每一行都具有表A中匹配的行,其中A_ID =任何一個值。換句話說,我需要B中的每個完整三元組的完全匹配集 - 沒有超集或子集。 B_ID和A_ID的值不重要。

我認爲分區是要走的路,因爲我已經有了自然分區A和B的列,並且我還認爲我可以預先選擇哪些分區,通過確保只有具有匹配行數的分區來連接試圖。我無法做到這一點 - 對兩個表進行分區很簡單,但我無法告訴連接只能對分區進行操作。

在此示例中,將返回(2,P),因爲集合P中的所有行均與集合2中的所有行匹配。結果(1,R)將不會返回,因爲集合R的所有行均未全部匹配套裝1等的行

回答

3

使用symetric difference

SELECT DISTINCT a1.A_ID, b1.B_ID 
FROM A a1,B b1 
WHERE NOT EXISTS (
        (SELECT v1,v2,v3 
        FROM A WHERE A.A_ID = a1.A_ID 
        EXCEPT 
        SELECT v1,v2,v3 
        FROM B WHERE B.B_ID = b1.B_ID 
        ) 
        UNION ALL 
        (
        SELECT v1,v2,v3 
        FROM B WHERE B.B_ID = b1.B_ID 
        EXCEPT 
        SELECT v1,v2,v3 
        FROM A WHERE A.A_ID = a1.A_ID) 
       ); 

LiveDemo

+1

它完美和相當快,too.THAT是很酷。非常感謝。 –