테이블에 존재하지 않는 목록에서 ID 찾기


19

다음 스키마와 데이터가 있다고 가정 해보십시오.

create table images(
  id int not null
);

insert into images values(1), (2), (3), (4), (6), (8);

다음과 같은 쿼리를 수행하고 싶습니다.

select id from images where id not exists in(4, 5, 6);

그러나 이것은 작동하지 않습니다. 위의 경우 5는 테이블 레코드에 없기 때문에를 반환해야 합니다.

답변:


23

values목록 에 대해 외부 조인을 사용할 수 있습니다 (위에서 언급 한 Martin의 답변과 유사).

select t.id
from (
  values (4),(5),(6) 
) as t(id)
  left join images i on i.id = t.id
where i.id is null;

또는 not exists행 생성자와 함께 :

select *
from ( 
   values (4),(5),(6)
) as v(id)
where not exists (select *
                  from images i
                  where i.id = v.id);

원하는 경우 valuesCTE에 절을 넣어 최종 쿼리를보다 쉽게 ​​읽을 수 있습니다.

with v (id) as (
 values (4),(5),(6)
)
select v.id
from v
  left join images i on i.id = v.id
where i.id is null;

10

이를 수행하는 한 가지 방법은 VALUESid를 사용하여 테이블 표현식을 작성 EXCEPT하여 누락 된 표현식을 확인하고 찾는 것입니다.

SELECT id
FROM (VALUES(4),(5),(6)) V(id)
EXCEPT
SELECT id 
FROM images;

6

@Martin providedEXCEPT 과 같은 방법을 사용하는 동안 중복을 접는 데 약간의 추가 비용을 지불하지 않는 한 반드시 확인하십시오 .EXCEPTALL

BTW, VALUES표현 자체가 가능합니다 :

VALUES (4),(5),(6)
EXCEPT ALL
SELECT id FROM images;

그러나이 방법으로 기본 열 이름을 얻습니다.

A에 대한 긴리스트 의 값 그 배열 unnest로 제공하는 것이 더 편리 할 수있다. 더 짧은 구문 :

SELECT * FROM unnest('{4,5,6}'::int[]) id
EXCEPT ALL
SELECT id FROM images;

이 작업에는 몇 가지 기본 기술이 있습니다.


0

두 번째 테이블을 사용하여 조인하십시오.

create table images1(
  id int not null
);

create table images2(
  id int not null
);

insert into images1 values(1), (2), (3), (4), (6), (8);

insert into images2 values (4), (5), (6);

SELECT i2.ID

FROM images2 i2

LEFT JOIN images1 i1
    ON i1.ID = i2.ID

WHERE i1.ID IS NULL

3
간단한 선택을 실행하고 이것을 위해 테이블을 만드는 경우 최상의 솔루션이 아닐 수 있습니다.
Patrick D' appollonio 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.