0

이 질문이 이미 제기되었지만 내 머리가 빠지면 ​​사과하십시오!중복 된 항목을 제거하는 방법은 무엇입니까? SQL Server 2008

나는 KI와 UG로 축약 된 두 개의 테이블을 가지고있다. KI에는 사람 목록과 사진이 들어 있으며 UG에는 다른 사람 목록이 들어 있습니다. 내가하고 싶은 일은 테이블을 일치시키고 KI & UG와 일치하는 이름 목록을 보여주는 쿼리를 반환하는 것입니다. 이제 중간에 있는데, 내 쿼리가 있는데 잘 작동합니다. 문제는 목록에 많은 중복이 있다는 것입니다. 원래 KI 테이블을 관리했던 사람들은 같은 사람에 대해 서로 다른 이미지를 입력하여 "John Smith"의 행이 여러 개 남았습니다.

SELECT ki.name, ug.name, ki.image_file 
FROM kantechimages AS ki 
INNER JOIN user_group as UG ON ki.name like ug.name 
WHERE ki.image_file is not null 
GROUP BY ki.name, ug.name, ki.image_file 

그래서 제 질문은, 어떻게 목록에서 중복 된 이름을 제거 할 수 있으며 우리는 대신에 그들 모두의 일치가 어디에서 하나 개의 행을 리턴 :

이 내 코드?

감사합니다.

+2

복제본 중에서 어떤 행을 반환해야하는지 어떻게 결정합니까? –

+0

사람마다 한 행을 원하면 그 사람에게 image_file을 사용 하시겠습니까? image_file 열의 데이터 형식은 무엇입니까? 파일 이름 또는 실제 이미지 데이터입니까? –

+0

방금 ​​두 테이블에서 사람의 이름을 반환하여 정확히 일치하는지 다시 확인하기를 원했고 이미지가있는 위치를 식별하는 데 필요한대로 image_file을 반환해야했습니다. image_file 열은 'nvarchar'이며 서버의 이미지 파일 이름 만 포함합니다. 내가 원하는 이미지 파일과 관련해서, 이미지 파일이있는 한 실제로는 문제가되지 않습니다.이전에 데이터베이스를 관리했던 사람들은 부주의했습니다. 새 데이터베이스를 추가 할 때 이전 데이터베이스를 삭제하지 않았습니다. – SamFarr

답변

0

이렇게하면 1 인당 한 줄을 얻을 수 있지만 이미지 파일은 하나뿐입니다.

SELECT ki.name, ug.name, max(ki.image_file) as image_file 
FROM kantechimages AS ki 
INNER JOIN user_group as UG ON ki.name like ug.name 
WHERE ki.image_file is not null 
GROUP BY ki.name, ug.name 

을 Rhys

+0

감사합니다. Rhys, 짧고 달콤합니다. – SamFarr

0

귀하의 질문은 다른 테이블에 그들에게 태그 이미지를 가진 사람의 이름을 얻기에만 관심이 있음을 시사하는 것으로 보인다. 당신은뿐만 아니라 다른 필드를 반환해야하는 경우

SELECT DISTINCT ki.name 
FROM kantechimages AS ki 
INNER JOIN user_group as UG ON ki.name like ug.name 
WHERE ki.image_file is not null 

는, 당신은 아래를 시도 할 수 있습니다 : 이런 경우, 당신은과 같이, 필터 조건을 만족에서 조인 고유 한 이름을 검색 할 수 있습니다 :

;with cte as 
(
    SELECT ki.name kiname, ug.name ugname, ki.image_file ki_image_file, 
    row_number() over (partition by ki.name order by ug.name) rn 
    FROM kantechimages AS ki 
    INNER JOIN user_group as UG ON ki.name like ug.name 
    WHERE ki.image_file is not null 
) 

select kiname, ugname, ki_image_file 
from cte 
where rn = 1 

Demo

+0

도움을 주셔서 감사합니다. 예를 들어 주셔서 감사합니다. – SamFarr

0

당신이 중복을 받고있는 이유는 이미지와 표 UG에 일치로 표 KI의 모든 행을 반환합니다 있도록, 이미지 파일을 사용하여 그룹화하는 것입니다.

단순히 일치하고 중요하지 만 ​​이미지 파일이 있음을, 그 아래 작동되는 이미지 파일을 반환있는 곳에 이름의 목록을 반환하려면 :

SELECT distinct ki.name 
FROM kantechimages AS ki 
INNER JOIN user_group as UG ON ki.name = ug.name 
WHERE ki.image_file is not null; 

하는 경우 그 이름에 정확히 일치하는 것을 찾고 있다면 '='는 패턴 일치를 수행하지 않으므로 'LIKE'보다 더 효율적입니다. 이 부분은 answer을 참조하십시오.

이미지가 중요한 경우 테이블 KI에서 여러 이미지로 이름을 필터링하는 기준을 결정해야합니다. 그런 다음 쿼리 작성 방법은 필터를 만들 수있는 열/데이터에 따라 다릅니다.

+0

또 다른 훌륭한 답변, 감사합니다. – SamFarr

관련 문제