2017-04-15 2 views

Antwort

1
SELECT s.v from generate_series(1, (select max(id) from your_table)) s(v) 
left join your_table 
on s.v = your_table.id 
WHERE your_table.id IS NULL 
+0

'NICHT EXISTS' Reiniger hier ist, aber letztlich hat es die gleiche Sache. 'SELECT sv aus generate_series (1, (wählen Sie max (id) aus Ihrer_Tabelle)) s (v) WO NICHT EXISTEN (SELECT 1 FROM your_table WHERE sv = id)' –

+0

@EvanCarroll - für mich persönlich, finden Sie Werte von "a" welche nicht in "b" sind, LEFT JOIN mit IS NULL ist sauberer. –

+0

Du bist einzigartig. =) Das 'NOT EXISTS' ist ziemlich semantisch und seine Bedingungen sind enthalten. –

1

Siehe generate_series(start, stop) Funktion finden. Just LEFT JOIN die Serie mit Ihrem id s, um die fehlenden zu bekommen.

Oder nur EXCEPT Betreiber

SELECT 
    generate_series(1, MAX(id)) AS id 
FROM 
    the_table 
EXCEPT 
SELECT 
    id 
FROM 
    the_table 
0

Artgründen verwenden, führt dies auch zu einer anti-join (like @Oto Shavadze's answer). Sie können wählen, welchen Stil Sie mehr mögen. NOT EXISTS sollte bevorzugt werden, wo anwendbar, da

  1. den Satz reduziert, und NOT EXISTS ist explizit, dass. Ein linker Join kann den Satz vergrößern.
  2. Es sind Bedingungen enthalten, es gibt keine Chance, dass die inner.id = outer.id von der Klausel abweichen kann.
  3. Die innere Tabelle wird nirgendwo anders in der Abfrage verfügbar gemacht. Hier

ist ein Beispiel,

SELECT s.v 
FROM generate_series(1, (SELECT max(id) FROM yourTable)) 
    AS s(v) 
WHERE NOT EXISTS (
    SELECT 1 
    FROM yourTable 
    WHERE s.v = id 
); 
Verwandte Themen