2016-05-23 85 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是很酷。非常感谢。 –