Identificare quali valori NON corrispondono a una riga della tabella


10

Vorrei poter verificare facilmente quali identificatori univoci non esistono in una tabella, tra quelli forniti in una query.

Per spiegare meglio, ecco cosa farei ora, per verificare quali ID dell'elenco "1, 2, 3, 4" non esistono in una tabella:

  1. SELECT * FROM dbo."TABLE" WHERE "ID" IN ('1','2','3','4'), diciamo che la tabella non contiene righe con ID 2.
  2. Scarica i risultati in Excel
  3. Esegui un VLOOKUP nell'elenco originale che cerca ciascun valore dell'elenco nell'elenco dei risultati.
  4. Qualsiasi VLOOKUP che risulta in #N/Aè su un valore che non si è verificato nella tabella.

Sto pensando che ci debba essere un modo migliore per farlo. Sto cercando, idealmente, qualcosa del genere

Elenco da controllare -> Query sulla tabella per verificare -> Membri dell'elenco non nella tabella


Per favore, non farci indovinare la versione di SQL Server?
Aaron Bertrand


Scuse. [modificato] È vecchio. Il problema con NOT IN è che restituirà tutto il resto nella tabella ...
NReilingh,

Risposte:


14

Utilizzare EXCEPT:

SELECT * FROM
  (values (1),(2),(3),(4)) as T(ID)
EXCEPT
SELECT ID 
FROM [TABLE];

Vedi SqlFiddle .


Il valuescostruttore funzionerà solo su SQL Server 2008 o versioni successive. Per il 2005, utilizzare

SELECT 'value'
UNION SELECT 'value'

come dettagliato in questa risposta SO .


Whoops, avrebbe dovuto specificare. Cosa succede se ID è un varchar?
NReilingh,

1
@NReilingh quindi ridisegna il tuo DB :) ma dovrebbe funzionare allo stesso modo penso
JNK

Continuo a Incorrect syntax near the keyword 'values'.correre quando SELECT * FROM (values ('search string'),('other string')) as T(ID)
corro

La tua sintassi funziona bene per me in SQL Server 2008r2 - Ho incollato il tuo commento ed è stato eseguito.
JNK,

Sono il 2005. Cristo.
NReilingh,

6

Costruirò una variabile di tabella o tabella temporanea contenente gli ID che stai cercando ... quindi utilizzare la soluzione di Remus, meno lo zucchero sintattico del 2008:

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];

3

Sono un paio d'anni più saggio (e ho un SQL Server più recente) rispetto a quando ho fatto questa domanda, quindi per celebrare il badge Famosa domanda che ho ottenuto per averlo fatto, ecco cosa farei ora. (Non credo di aver mai usato l' EXCEPToperatore da allora.)

Direi che il LEFT JOINmetodo seguente è più utile rispetto a EXCEPTquando puoi comporlo con altri join senza bisogno di un CTE.

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;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.