Suchen Sie IDs aus einer Liste, die in einer Tabelle nicht vorhanden sind


19

Angenommen, ich habe das folgende Schema und die folgenden Daten:

create table images(
  id int not null
);

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

Ich möchte eine Abfrage durchführen wie:

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

Das geht aber nicht. Der obige Fall sollte zurückgegeben werden 5, da er in den Tabellendatensätzen nicht vorhanden ist.

Antworten:


23

Sie können einen Outer Join für eine valuesListe verwenden (ähnlich wie bei der oben genannten Antwort von 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;

oder a not existszusammen mit dem Zeilenkonstruktor:

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

Wenn Sie möchten, können Sie die valuesKlausel auch in einen CTE einfügen, um die endgültige Abfrage besser lesbar zu machen:

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

Eine Möglichkeit wäre VALUES, einen Tabellenausdruck mit den IDs zu erstellen EXCEPT, um die fehlenden zu überprüfen und zu finden.

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

6

Bei der Verwendung von EXCEPTwie @ Martin zur Verfügung gestellt , denken Sie daran , es zu machen EXCEPTALL, es sei denn , Sie versuchen , Duplikate zu falten , ein wenig mehr zu zahlen bereit ist .

Übrigens kann ein VALUESAusdruck für sich stehen:

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

Auf diese Weise erhalten Sie jedoch Standardspaltennamen.

Für eine lange Liste von Werten ist es möglicherweise praktischer, sie als Array und als unnest bereitzustellen. Kürzere Syntax:

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

Es gibt ein paar grundlegende Techniken für die Aufgabe:


0

Benutze einfach einen zweiten Tisch und schließe dich ihnen an.

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
Wenn Sie eine einfache Auswahl ausführen und dafür eine Tabelle erstellen, ist dies möglicherweise nicht die beste Lösung.
— Patrick D'appollonio
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.