2016-06-02 2 views
0

메일 링리스트가 있고 중복 된 항목이 많습니다. 내가 그들을 제거 할 수 있도록 중복을 찾으려고 노력하고있어. 아래의 전체 쿼리를 실행할 때 테이블의 모든 항목을 가져옵니다 (142,000 +). 하위 쿼리를 실행할 때 나는 5768 행만 얻습니다. 어떤 중복 행을 삭제할지 결정하려면 각 중복 행의 모든 ​​열이 필요합니다. 전체 쿼리가 모든 행을 반환하도록 만드는 것은 무엇을 잘못하고 있습니까?SQL exists 모든 행을 반환합니다.

select * from Mailinglist 
where exists 
(select count(*), mailaddress, CenterName 
from Mailinglist 
group by MailAddress, CenterName 
having count(*)>1) 
+2

내부 쿼리를 실행하지 않는 이유는 무엇입니까? 'Having' 조항이있는 것은 무엇입니까? – codingbiz

+0

@codingbiz 하위 쿼리는 삭제 후 하나 이상의 데이터가 필요하므로 하나만 제외하고 중복 된 결과가 삭제됩니다. '오프셋 2 다음에 100 행 가져 오기'를 사용할 수 있습니다. –

+0

하위 쿼리는 외부 쿼리와 관련이 없습니다. 왜 외부 쿼리에서 모든 행을 반환합니다. –

답변

3

당신은 그것을 이런 식으로 할 필요가 :

select t1.*, t2.cnt 
from Mailinglist t1 
join (
    select count(*) as cnt, mailaddress, CenterName 
    from Mailinglist 
    group by MailAddress, CenterName 
    having count(*)>1 
) t2 ON t1.MailAddress = t2.MailAddress and t1.CenterName = t2.CenterName 

EXISTS 사용은 레코드, 존재를 확인, 여부 : 하나 개 이상의 레코드 하위 쿼리가 반환 한 후 EXISTStrue로 평가되면 .

2

EXISTS은 그 뒤에 나오는 쿼리에 단일 레코드가있는 경우 true를 반환합니다. 당신이 찾고있는 것은

select * from Mailinglist 
where mailaddress IN 
(
    select mailaddress 
    from Mailinglist 
    group by MailAddress, CenterName 
    having count(*)>1 
) 
0

서브 쿼리가 행을 EXISTS 반환 true를 돌려주는 경우 때문입니다. 하위 쿼리 이 하나 이상의 행을 반환하므로 EXISTS 조건의 경우 TRUE을 반환합니다. , 중복을 삭제하려면

SELECT 
    COUNT(*), 
    mailaddress, 
    CenterName 
FROM Mailinglist 
GROUP BY 
    MailAddress, CenterName 
HAVING COUNT(*) > 1 

당신은 ROW_NUMBER가 사용할 수 있습니다 :

는 그냥 서브 쿼리를 실행할 수 있으며, MailingList 중복으로 얻으려면

WITH Cte AS(
    SELECT *, 
     rn = ROW_NUMBER() OVER(PARTITION BY MailAddress, Centername ORDER BY (SELECT NULL)) 
    FROM MailingList 
) 
DELETE FROM Cte WHERE rn > 1 

는 그냥 ORDER BY 절에 따라 교체 보유하려는 복제본의 행

0

하위 쿼리에 필터링 (위치)이 없으므로 항상 결과가 나타납니다.

SELECT  * 
FROM   Mailinglist AS ML 
WHERE  EXISTS 
     (SELECT  COUNT(*) AS Expr1, mailaddress, CenterName 
     FROM   Mailinglist AS CNT 
     WHERE  (ML.MailAddress = CNT.MailAddress) AND (ML.CenterName = CNT.CenterName) 
     GROUP BY mailaddress, CenterName 
     HAVING   (COUNT(*) > 1)) 
관련 문제