2016-12-10 4 views
-1

Ich habe also zwei Tabellen.Liste Projekte, die niemanden mit der Verwendung von NOT IN

Projekte

**p_id** | manager | name | date |  
t2   andrew CSO 11/12/13 

Mitarbeiter

id | name | surname | id_division | sallary | **project**  
1 kate black   57  1500  t2 

Und Spalte Projekt und p_id sind entsprechende entires.

Ich möchte alle Projekte auflisten, die niemanden anstellen. Also, wenn ich es richtig mache, gibt es nicht p_id dieses Projekts in der Employees-Tabelle in der Projektspalte und ich möchte es mit der Verwendung von NOT IN machen.

Ich habe versucht, es so zu tun, aber ich nicht funktioniert:

SELECT * 
FROM projects 
WHERE p_id NOT IN 
(SELECT project FROM Employees); 

Es wählen keine Zeile. Aber es gibt ein Projekt, das keinen Mitarbeiter hat, weil er in der Projects-Tabelle ist und p_id hat, das nicht in der Employees-Tabelle in der Projektreihe vorhanden ist.

+0

Haben Sie 'NULL' Datensätze in der Spalte 'project'? –

+0

Ja, ich habe welche. – qamyk

+0

Sie haben die Antwort erhalten –

Antwort

1

Ich rate dringend davon ab, NOT IN mit Unterabfragen zu verwenden. Wenn eine Zeile, die von der Unterabfrage zurückgegeben wird, einen Wert NULL hat, wird nichts zurückgegeben.

Verwenden Sie stattdessen NOT EXISTS:

SELECT p.* 
FROM projects p 
WHERE NOT EXISTS (SELECT 1 FROM employees e where e.project = p.p_id); 

Diese die Semantik, die Sie erwarten.

Sie können Verwendung NOT IN, wenn Sie NULL Werte herauszufiltern:

SELECT p.* 
FROM projects p 
WHERE p.p_id NOT IN (SELECT e.project FROM Employees e WHERE e.project IS NOT NULL); 

Aber ich empfehle NOT EXISTS, weil es weniger anfällig für Codierung oder Datenfehler ist.

+0

Danke, es war sehr hilfreich! – qamyk

+0

@qamyk - Hinzufügen zu Gordons Antwort: Wenn die Liste in der Bedingung NOT IN NULL enthält, wird nichts ausgewählt. Es gibt keinen Wert, der GARANTIERT ist, um sich von NULL zu unterscheiden. (Formal ausgedrückt: 'x nicht in (a, b, NULL)' bedeutet 'x <> a und x <> b und x <> NULL'. Der letzte Wert wird UNKNOWN, nicht TRUE - und dann der gesamte Ausdruck , verknüpft mit AND, kann niemals TRUE sein, da mindestens einer der Begriffe UNKNOWN, nicht TRUE ist). – mathguy

Verwandte Themen