태그 보관물: sql-server-2005

sql-server-2005

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

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

더 잘 설명하기 위해, 테이블에 존재하지 않는 목록 “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 은 테이블에서 발생하지 않은 값에 있습니다.

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

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



답변

사용 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가 포함 된 테이블 변수 또는 임시 테이블을 작성하고 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];

답변

나는 지금이 질문을 할 때보 다 몇 년 더 현명하고 최신 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;

답변