我有两个表,它们的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之间产品不是同一套(任何订单)的所有人员标识。因此,在这种情况下为:
人员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

我还具有连接前形式的数据,每个人身有多行(每个产品一个,在两个表中分别有一个行),如果这样做更有帮助-我还没有弄清楚如何按字母顺序连接它们,因此解决该问题的方法也将解决此问题。

编辑(说明):
未连接的数据如下所示:

表格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将它们连接起来。

最佳答案

如果每行以一种产品的形式提供产品,那么您可以查询相反表中所有与产品和个人ID都不匹配的结果。然后对另一个表执行相同操作,并合并结果:

SELECT t1.personid, t1.product, '2' AS [Not Found In Table]
FROM table1 t1
LEFT JOIN table2 t2 ON t1.personid = t2.personid AND t1.product = t2.product
WHERE t2.product IS NULL
UNION
SELECT t2.personid, t2.product,  '1' AS [Not Found In Table]
FROM table2 t2
LEFT JOIN table1 t1 ON t2.personid = t1.personid AND t2.product = t1.product
WHERE t1.product IS NULL

您可以将其包装在select中,并用CONCAT将结果提供给您一个不错的列表,列出每个不匹配的人在哪个表中缺少的内容。

关于sql - SQL Server:比较级联列的无序集是否相等,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38175072/

10-12 14:17
查看更多