根据多列找到匹配的行(列的顺序无关紧要)

时间:2013-10-14 02:37:35

标签: mysql .net sql

我有一个像这样的表结构

PersonID   |  Name   |  ItemID1  |  ItemID2  |ItemID3  | ItemID4
1          |  kk     |   1       |  2        |NULL     | NULL
2          |  KK     |   1       |  NULL     | 2       | NULL

在上面的数据集中,如果两个人具有相同的名称和相同的项目集(这里的项目序列不匹配),则两个人是相同的。基本上,在第1行中,人名是KK,项目列表是1和2,第2行也是如此。这两个是匹配的行。

我需要编写一个sql查询来查找这些匹配的行吗?

2 个答案:

答案 0 :(得分:2)

首先,这打破了'数据规范化',但也许您知道并且需要基于某些约束来实现它,或者因为它通常更容易为您的解决方案。

这是一个解决方案(有很多):

首先在VIEW中使用UNION ALL查询来展平您的数据。我们将此视图称为viewFlattedPeopleWithItems(您也可以使用临时表或虚拟表!):

SELECT PersonID, Name, ItemID1 as ItemID
FROM TABLE
UNION ALL
SELECT PersonID, Name, ItemID2
FROM TABLE
UNION ALL
SELECT PersonID, Name, ItemID3
FROM TABLE
UNION ALL
SELECT PersonID, Name, ItemID4
FROM TABLE

然后找到重复的数据:

SELECT Name, Item, COUNT(*)
FROM viewFlattedPeopleWithItems
GROUP BY Name, Item
HAVING COUNT(*) > 1

如果需要,您还可以使用第二个查询来创建视图或临时表或类似表,然后再联接到union all查询以获取具有重复的PersonID值。

答案 1 :(得分:2)

此查询将使列(itemID列)的所有值都在一列

   SELECT id,name,  case WHEN itemid1 IS NOT NULL THEN  CONVERT(varchar(10), itemid1) + ','
 else '' end  +  case WHEN itemid2 IS NOT NULL THEN  CONVERT(varchar(10), itemid2) + ',' else
 ''  end  +  case WHEN itemid3 IS NOT NULL THEN  CONVERT(varchar(10), itemid3) + ','  else '' 
end +  case WHEN itemid4 IS NOT NULL THEN  CONVERT(varchar(10), itemid4) + ','  else '' end  
 as itemid FROM emp

现在你必须编写一个函数来命令ItemID列的逗号分隔值并返回字符串。这就是所有..现在你可以很容易地完成匹配......但这不会给出好的表现..

使用相同的查询创建计算列将为您提供性能..