仅加入两个表的分区

时间:2016-05-23 18:29:15

标签: sql sql-server

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的每一行,其中B_ID =任何一个值在表A中具有一个匹配的行,其中A_ID =任何一个值。换句话说,对于B中的每个完整三元组,我需要A中的完全匹配集 - 没有超集或子集。 B_ID和A_ID的值并不重要。

我认为分区是可行的方法,因为我已经有了自然分区A和B的列,我还以为我可以通过确保只有匹配行数的分区来预先选择JOIN的分区。尝试。我无法做到 - 对两个表进行分区很容易,但我认为没有办法告诉联接只能对分区进行操作。

在此示例中,将返回(2,P),因为Set P中的所有行都与Set 2中的所有行匹配。将不返回Result(1,R),因为Set R的所有行都不与所有行匹配第1组等等。

1 个答案:

答案 0 :(得分:3)

使用do.call(rbind, apply(df, 1, function(x) data.frame(ID = x[1], Date = x[2], Dx = strsplit(x[3], ";"), row.names = NULL))) ID Date Dx 1 1 10/1/15 anemia 2 1 10/1/15 headache 3 2 10/1/15 migraine 4 2 10/1/15 anemia 5 3 10/2/15 diabetes

symetric difference

LiveDemo