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组等等。
答案 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
强>