Tabloda bulunmayan bir listeden kimlikleri bulma


19

Aşağıdaki şema ve verilerim olduğunu varsayalım:

create table images(
  id int not null
);

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

Gibi bir sorgu gerçekleştirmek istiyorum:

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

Ama bu işe yaramıyor. Yukarıdaki durum 5tablo kayıtlarında olmadığı için geri dönmelidir .

Yanıtlar:


23

Bir valueslisteye karşı bir dış birleşim kullanabilirsiniz (Martin yukarıda belirtilen cevaba benzer):

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;

veya not existssatır oluşturucu ile birlikte:

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

İsterseniz values, son sorguyu daha kolay okunması için yan tümceyi bir CTE'ye de ekleyebilirsiniz:

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

Bunu yapmanın bir yolu , eksik olanları VALUESkontrol etmek ve EXCEPTbulmak için kimlikleri olan bir tablo ifadesi oluşturmaktır .

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

6

Kullanırken EXCEPTgibi @Martin sağlanan , bunu yapmak için hatırlamak EXCEPTALLEğer çiftleri katlamak çalıştıkları için biraz ekstra ödemek istemiyorsanız.

BTW, bir VALUESifade kendi başına durabilir:

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

Ancak varsayılan sütun adlarını bu şekilde alırsınız.

Uzun bir değer listesi için, onu dizi ve dürüst olmayan olarak sağlamak daha uygun olabilir. Daha kısa sözdizimi:

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

Görev için birkaç temel teknik var:


0

Sadece ikinci bir masa kullanın ve onlara katılın.

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
Basit bir seçim yapıyorsanız ve sadece bunun için bir tablo oluşturuyorsanız, bu en iyi çözüm olmayabilir.
Patrick D'appollonio
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.