【发布时间】:2016-11-05 14:47:55
【问题描述】:
我有两个表,其中包含一个 ID 列(将表匹配在一起)和连接列,其中连接值的顺序是任意的。我想比较两列是否包含完全相同的项目(以任何顺序),如果不包含则输出 ID。
例子:
表 1
PersonID Products
1 Apple|Pear|Orange
2 Flour|Apple|Butter
3 Apple
4 Banana|Cashews
5 Juice|Crackers|Banana|Cashews
6 Cashews
表 2
PersonID Products
1 Orange|Apple|Pear
2 Flour|Apple|Butter
3 Apple|Banana
4 Banana
5 Crackers|Juice|Banana|Cashews
6 Pear|Crackers
我想获取表 1 和表 2 之间产品不是相同集合(任何顺序)的所有 personids。所以在这种情况下是: 第 3 个人(额外产品)、第 4 个人(缺失产品)和第 6 个人(不同产品)。
我当前的查询错误地选择了第 1 个人和第 5 个人,因为他们的产品订购方式不同。
我目前的查询是这样的:
select t1.personid, t1.products as t1products, t2.products as t2products
from table1 t1 (nolock)
inner join table2 t2 (nolock) on t1.personid = t2.personid
where t1.products != t2.products
我也有预连接形式的数据,每个 personid 有多行(每个产品一个,然后分别在两个表中),如果这更有帮助 - 我还没有想出如何将它们连接到按字母顺序,所以解决这个问题的方法也可以解决这个问题。
编辑(澄清): 未连接的数据如下所示:
表 1
PersonID Product
1 Apple
1 Pear
1 Orange
2 Flour
2 Apple
2 Butter
3 Apple
等等
表 2
PersonID Product
1 Orange
1 Apple
1 Pear
2 Flour
2 Apple
2 Butter
3 Apple
3 Banana
等等
我使用 STUFF 按 PersonID 连接它们。
【问题讨论】:
-
如果您要走这条路,有多少列产品需要按字母顺序排列?如果只有几列,这就像一些嵌套的
CASE语句和>或<运算符一样简单。 -
产品的结构是多行,而不是列(因此 jobid 在多行上重复)。它们可以从 1 到 300 行,最常见的是每行大约 5-10 行
标签: sql sql-server set concatenation equality