2013-10-14 6 views
2

제가 상기 데이터 셋이여러 열을 기반으로 행 일치 찾을

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

같은 테이블 구조를 갖는다 (컬럼의 순서는 중요하지 않음)가 동일한 이름과 같은있을 경우, 두 사람이 동일한 항목 집합 (항목 순서가 여기에 일치하지 않음) 기본적으로 행 1에서 사람 이름은 KK이고 항목 목록은 1과 2이며, 행 2와 동일합니다.이 2 개가 일치하는 행입니다.

이러한 일치하는 행을 찾기 위해 SQL 쿼리를 작성해야합니까?

답변

2

이 쿼리는 단일 열

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 

에 모든 열 값 (항목 ID 열)을 만들 것입니다 지금 당신은 항목 ID 컬럼의 쉼표로 구분 된 값을 주문하고 문자열을 반환하는 함수를 작성해야합니다. 그게 모든 ... 지금 당신은 쉽게 일치 할 수 있습니다 ..하지만이 .. 당신에게 성능을 얻을 것 같은 쿼리 계산 된 열을 만들기

..

2

우선, 이는 '데이터 정규화'를 중단하지만, 일부 제약 조건을 기반으로 구현하거나 솔루션을 일반적으로 더 쉽게 구현할 필요가 있음을 알고있을 것입니다.

먼저 데이터를 평평하게하기 위해 VIEW에서 UNION ALL 쿼리를 사용

여기에 하나 개의 솔루션 (많은 사람들이있다)이다. (당신은 또한 단지 임시 테이블 또는 가상 테이블을 사용할 수 있습니다!)의이보기 viewFlattedPeopleWithItems을 부르 자 : 당신이 원하는 경우

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

, 당신은이 초를 사용할 수 있습니다 그리고

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 

중복 데이터를 찾을 수 쿼리를 사용하여 뷰 또는 임시 테이블 또는 유사 항목을 만든 다음 유니온 모든 쿼리에 다시 가입하여 복제 된 PersonID 값을 가져옵니다.

+0

좋은 성능을 제공하지 않습니다이 날의 목록을 제공합니다 personid/name 및 itemid를 기반으로 중복됩니다. 나는 실제로 모든 4 열 값의 체크섬을 보유 할 계산 된 열을 생각하고 있습니다. 그리고 두 개의 레코드의 체크섬을 비교하여 이들이 중복되는지 확인해야합니다 ...하지만 나는 추측합니다 nulls는 문제를 만들고 있습니다 ... select * from TABLE group from name, computedcolumn –

+0

그럴 경우 왜 ISNULL() 함수를 사용하고 null을 0으로 변환하지 않습니까? 예 ISNULL (ItemIDx, 0) –

+0

personid와 name을 통해 분할 된 Row_Number()를 사용하여 중복을 해결할 수 있습니다 ... 기본적으로 w 키를 만듭니다. 여기에는 그 (것)들이 없다. –

관련 문제