특정 필드에서 중복을 찾으려면 명령문을 선택하십시오.
여러 필드에서 중복 항목을 찾는 SQL 문을 도와 줄 수 있습니까?
예를 들어, 의사 코드에서 :
select count(field1,field2,field3)
from table
where the combination of field1, field2, field3 occurs multiple times
위의 문장에서 여러 번 발생 하면 첫 번째 레코드를 제외한 모든 레코드 를 선택 하고 싶습니다 .
여러 레코드가있는 필드 목록을 얻으려면 다음을 사용할 수 있습니다.
select field1,field2,field3, count(*)
from table_name
group by field1,field2,field3
having count(*) > 1
행을 삭제하는 방법에 대한 자세한 내용은이 링크를 확인하십시오.
http://support.microsoft.com/kb/139444
편집 : 다른 사용자가 언급했듯이 위의 링크에서 접근 방식을 사용하기 전에 "첫 번째 행"을 정의하는 방법을 결정하는 기준이 있어야합니다. 이를 바탕으로 order by 절과 필요한 경우 하위 쿼리를 사용해야합니다. 샘플 데이터를 게시 할 수 있다면 실제로 도움이 될 것입니다.
"첫 번째"를 언급 했으므로 데이터에 대해 일종의 주문이 있다고 가정합니다. 데이터가 일부 필드에 의해 정렬된다고 가정 해 봅시다 ID
.
이 SQL은 첫 번째 항목을 제외하고 중복 항목을 가져옵니다. 기본적으로 (a) 동일한 필드와 (b) 더 낮은 ID를 가진 다른 행이있는 모든 행을 선택합니다. 성능은 좋지 않지만 문제를 해결할 수 있습니다.
SELECT A.ID, A.field1, A.field2, A.field3
FROM myTable A
WHERE EXISTS (SELECT B.ID
FROM myTable B
WHERE B.field1 = A.field1
AND B.field2 = A.field2
AND B.field3 = A.field3
AND B.ID < A.ID)
이것은 내가 좋아하는 SQL Server 2005의 재미있는 솔루션입니다. "첫 번째 레코드를 제외한 모든 레코드"에 대해 "첫 번째"행을 식별하는 데 사용할 수있는 또 하나의 "id"열이 있다고 가정합니다.
SELECT id
, field1
, field2
, field3
FROM
(
SELECT id
, field1
, field2
, field3
, RANK() OVER (PARTITION BY field1, field2, field3 ORDER BY id ASC) AS [rank]
FROM table_name
) a
WHERE [rank] > 1
중복 값을 보려면
with MYCTE as (
select row_number() over ( partition by name order by name) rown, *
from tmptest
)
select * from MYCTE where rown <=1
SQL Server 2005 이상을 사용하고 있고 (질문에 대한 태그가 SQL Server 2008을 나타내는 경우) 조인을 사용하는 것이 바람직하지 않거나 실용적이지 않은 경우 순위 함수를 사용하여 첫 번째 레코드 이후에 중복 레코드를 반환 할 수 있습니다. 다음 예제는이를 실제로 보여줍니다. 여기서 검사 된 열의 null 값과도 작동합니다.
create table Table1 (
Field1 int,
Field2 int,
Field3 int,
Field4 int
)
insert Table1
values (1,1,1,1)
, (1,1,1,2)
, (1,1,1,3)
, (2,2,2,1)
, (3,3,3,1)
, (3,3,3,2)
, (null, null, 2, 1)
, (null, null, 2, 3)
select *
from (select Field1
, Field2
, Field3
, Field4
, row_number() over (partition by Field1
, Field2
, Field3
order by Field4) as occurrence
from Table1) x
where occurrence > 1
이 예를 실행하면 모든 "그룹"에서 첫 번째 레코드가 제외되고 널값을 가진 레코드가 올바르게 처리됩니다.
그룹 내에서 레코드를 주문할 수있는 열이없는 경우 분할 기준 열을 순서별 열로 사용할 수 있습니다.
CREATE TABLE #tmp
(
sizeId Varchar(MAX)
)
INSERT #tmp
VALUES ('44'),
('44,45,46'),
('44,45,46'),
('44,45,46'),
('44,45,46'),
('44,45,46'),
('44,45,46')
SELECT * FROM #tmp
DECLARE @SqlStr VARCHAR(MAX)
SELECT @SqlStr = STUFF((SELECT ',' + sizeId
FROM #tmp
ORDER BY sizeId
FOR XML PATH('')), 1, 1, '')
SELECT TOP 1 * FROM (
select items, count(*)AS Occurrence
FROM dbo.Split(@SqlStr,',')
group by items
having count(*) > 1
)K
ORDER BY K.Occurrence DESC
이 쿼리를 시도하여 각 SELECT 문을 sepratley로 계산하십시오.
select field1,count(field1) as field1Count,field2,count(field2) as field2Counts,field3, count(field3) as field3Counts
from table_name
group by field1,field2,field3
having count(*) > 1
참고 URL : https://stackoverflow.com/questions/4434118/select-statement-to-find-duplicates-on-certain-fields
'Programming' 카테고리의 다른 글
누구나 평신도 용어로 JSONP가 무엇인지 설명 할 수 있습니까? (0) | 2020.02.20 |
---|---|
C #으로 JSON을 구문 분석하려면 어떻게해야합니까? (0) | 2020.02.20 |
objective-c / cocoa에서 예외 발생 (0) | 2020.02.20 |
반복하는 동안 일반 목록에서 요소를 제거하는 방법은 무엇입니까? (0) | 2020.02.20 |
JavaScript에서 선행 0으로 숫자 채우기 (0) | 2020.02.20 |