SQL NOT IN clausola
-
25-09-2019 - |
Domanda
Ho una domanda che non sta funzionando come previsto
Q1:
SELECT id, name
FROM vw_x
WHERE id NOT IN (select pid from table_x)
GROUP BY id, name
Having max(c_date) > GETDATE()
Q2:
SELECT id, name
FROM vw_x
GROUP BY id, name
Having max(c_date) > GETDATE()
Q1 non restituisce nulla anche se so questi ID non sono in table_x corre Q2 correttamente senza NON IN
Cosa c'è di sbagliato con la mia domanda?
Soluzione
si dispone di un valore NULL nella tabella
Prova questo
SELECT id, name
FROM vw_x
WHERE id NOT IN (select pid from table_x where pid is not null)
GROUP BY id, name
Having max(c_date) > GETDATE()
o del presente
SELECT id, name
FROM vw_x
WHERE NOT EXISTS (select 1 from table_x where pid = vw_x.id )
GROUP BY id, name
Having max(c_date) > GETDATE()
Si veda anche Seleziona tutte le righe da una tabella che non esistono in un'altra tabella
Altri suggerimenti
Cosa succede ad usare un LEFT JOIN?
SELECT id, name
FROM vw_x
LEFT JOIN table_x on id = pid
WHERE pid IS NULL
GROUP BY id, name
Having max(c_date) > GETDATE()
C'è un'altra situazione: la subquery può restituire nulla. SQL Server non funziona come previsto se la clausola NOT IN restituisce una lista nulla. Ho una domanda simile alla seguente:
select * from table where id not in (select id from tableB where somecondition(x))
Quando la sottoquery contiene un elenco di ID, la query restituirà i dati come previsto. Ma quando la subquery restituisce nulla, la query restituirà ancora i dati, ma poi si blocca.
ho cambiato la query al seguente e ha risolto il problema:
select * from table where id not in (select id from tableB where somecondition(x) **union all select 0**)
che si assicura la subquery conterrà almeno un numero.