SQL nicht in Klausel
-
25-09-2019 - |
Frage
Ich habe eine Frage, die nicht wie erwartet funktioniert
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 gibt nichts zurück, obwohl ich weiß, dass diese IDs nicht in table_x q2 ordnungsgemäß sind, ohne nicht in
Was könnte mit meiner Frage falsch sein?
Lösung
Sie haben einen Nullwert in der Tabelle
Versuche dies
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()
oder dieses
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()
Siehe auch Wählen Sie alle Zeilen aus einer Tabelle aus, die in einer anderen Tabelle nicht vorhanden ist
Andere Tipps
Was ist mit einem linken 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()
Es gibt eine andere Situation: Die Unterabfrage kann nichts zurückgeben. SQL Server funktioniert nicht wie erwartet, wenn die Nicht -in -Klausel eine NULL -Liste zurückgibt. Ich habe eine Frage wie Folgendes:
select * from table where id not in (select id from tableB where somecondition(x))
Wenn die Unterabfrage eine Liste von IDs enthält, gibt die Abfrage die Daten wie erwartet zurück. Aber wenn die Unterabfrage nichts zurückgibt, wird die Abfrage weiterhin Daten zurückgeben, aber dann steckt.
Ich habe die Abfrage in Folgendes geändert und das Problem gelöst:
select * from table where id not in (select id from tableB where somecondition(x) **union all select 0**)
Dies stellt sicher, dass die Unterabfrage mindestens eine Zahl enthält.