테이블 행과 일치하지 않는 값 식별


10

쿼리에 제공된 식별자 중 테이블에 존재하지 않는 고유 식별자를 쉽게 확인할 수 있기를 원합니다.

더 잘 설명하기 위해, 테이블에 존재하지 않는 목록 "1, 2, 3, 4"의 ID를 확인하기 위해 지금 내가 할 일이 있습니다.

  1. SELECT * FROM dbo."TABLE" WHERE "ID" IN ('1','2','3','4')테이블에 ID 2 인 행이 없다고 가정 해 보겠습니다.
  2. 결과를 Excel로 덤프
  3. 결과 목록에서 각 목록 값을 검색하는 원래 목록에서 VLOOKUP을 실행하십시오.
  4. 결과로 #N/A나오는 VLOOKUP 은 테이블에서 발생하지 않은 값에 있습니다.

더 좋은 방법이 있어야한다고 생각합니다. 이상적으로는 다음과 같은 것을 찾고 있습니다.

확인할 목록-> 확인할 테이블 쿼리-> 테이블에없는 목록의 멤버


SQL Server의 버전을 추측하지 마십시오?
Aaron Bertrand


사과. [편집] 오래되었습니다. NOT IN의 문제점은 테이블의 다른 모든 것을 반환한다는 것입니다.
NReilingh

답변:


14

사용 EXCEPT:

SELECT * FROM
  (values (1),(2),(3),(4)) as T(ID)
EXCEPT
SELECT ID 
FROM [TABLE];

SqlFiddle을 참조하십시오 .


values생성자는 SQL 서버 2008 이상에서 작동합니다. 2005 년에는

SELECT 'value'
UNION SELECT 'value'

이 SO 답변에 자세히 설명되어 있습니다.


으악, 지정해야합니다. ID가 varchar이면 어떻게 되나요?
NReilingh

1
@NReilingh는 다음 DB를 재 설계 :)하지만 내 생각 같은 작업을해야
JNK

Incorrect syntax near the keyword 'values'.달리기를 계속 합니다SELECT * FROM (values ('search string'),('other string')) as T(ID)
NReilingh

귀하의 구문은 SQL Server 2008r2에서 제대로 작동합니다. 귀하의 의견을 붙여 넣었습니다.
JNK

저는 2005 년입니다. 그리스도.
NReilingh

6

검색중인 ID가 포함 된 테이블 변수 또는 임시 테이블을 작성하고 2008 구문 구문을 뺀 Remus의 솔루션을 사용하십시오.

declare @t table (ID int)
insert into @t values (1)
insert into @t values (2)
insert into @t values (3)
insert into @t values (4)
insert into @t values (5)

select ID from @t
except
select ID
from [Table];

3

나는 지금이 질문을 할 때보 다 몇 년 더 현명하고 최신 SQL Server를 보유하고 있습니다. (그 EXCEPT이후로 연산자를 사용한 적이 없다고 생각 합니다.)

CTE가 필요없이 다른 조인으로 구성 할 수 있기 때문에 LEFT JOIN아래 방법이 더 유용 하다고 말합니다 EXCEPT.

SELECT v.val
  FROM (VALUES (1), (2), (3), (4), (5)) v (val)
    LEFT JOIN dbo.SomeTable t
      ON t.id = v.val
  WHERE t.id IS NULL;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.