我有两个表,它们的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/