2016-06-03 3 views
2
Result1  Result2 
a   a 
b   b  
a 

두 결과 집합을 뺄셈을 통해 a을 얻는 방법. NOT EXISTSNOT IN은이 두 결과 집합에 대해 아무 것도 반환하지 않습니다. 하지만 a이 반환되기를 바랍니다. 도움이됩니다!두 결과 집합을 빼기 SQL

+1

사용중인 SQL 버전은 무엇입니까? –

+0

첫 번째 결과 집합에 세 개의 'a'레코드가 있다고 가정합니다. 그러면 어떤 출력을 원할 것입니까? –

+0

@Tim Biegeleisen, SQL 2012. 'Result1'에 3'a''가 있으면 2'a's가 반환됩니다. – Isuru

답변

1

흠. . . 카운트를 고려하기 때문에 까다 롭습니다. 한 가지 방법은 다음과 같습니다.

select r1.col, r1.cnt - coalesce(r2.cnt, 0) 
from (select col, count(*) as cnt 
     from result1 
     group by col 
    ) r1 left join 
    (select col, count(*) as cnt 
     from resuult2 
     group by col 
    ) r2 
    on r1.col = r2.col 
where r1.cnt > coalesce(r2.cnt, 0); 

이것은 정확히 원하는 것을 반환하지는 않지만 충분할 수도 있습니다.

표준 SQL로
select r1.col 
from (select col, row_number() over (partition by col order by col) as seqnum 
     from result1 
     group by col 
    ) r1 left join 
    (select col, row_number() over (partition by col order by col) as seqnum 
     from resuult2 
     group by col 
    ) r2 
    on r1.col = r2.col and r1.seqnum = r2.seqnum 
where r2.col is null; 
+0

고마워요!. 첫 번째 방법을 시도하고 예상 결과를 주었다. 방법 2, 아직 시도. – Isuru

2

, 당신이에 대한 except all 연산자를 사용할 수 있습니다 : : 또 다른 방법은 row_number() 사용하는 것

select * 
from table_one 
except all 
select * 
from table_two 

SQLFiddle : http://sqlfiddle.com/#!15/d998c/1

주 당신은 table_onea 두 번이 있다면 위 쿼리는 두 번 반환합니다.

+0

답변 해 주셔서 감사합니다. 이렇게하면 'EXCEPT 연산자의'ALL '버전이 지원되지 않습니다.'라는 오류가 발생합니다. 이유는 무엇입니까? – Isuru

+0

@ Isuru : 어떤 DBMS를 사용하고 있습니까? –

+0

'SQL 서버 관리 스튜디오 2012'. 그것이 작동한다면 나는 당신의 방법이 선생님을 다루는 것이 더 간단하다고 생각합니다. – Isuru

관련 문제