2017-10-06 1 views
-1

Ich habe zwei Tabellen Projekt und Abteilung Ich mag das Projekt Besitzer von Projekttabelle erhalten, die in Tabelle department nicht in Abteilungsleiter Bereich ist ich den Codenicht in Klausel nicht in mysql Arbeits

select p.* from project p inner join department d on p.department_string_id=d.department_string_id WHERE p.project_owner NOT IN d.department_head 

habe aber zeigt Syntaxfehler in meiner Abfrage.Was ich falsch gemacht habe. Warum 'NOT IN' -Klausel nicht funktioniert.

+0

Was 'd.department_head' ist? Wenn es nur ein einzelner Wert ist, möchten Sie '! ='. Wenn es eine durch Kommas getrennte Liste ist, dann machen Sie Datenbanken * schrecklich * falsch (aber 'FIND_IN_SET()' könnte Sie retten). Wenn es mehrere Zeilen gibt, möchten Sie vielleicht "NOT EXISTS" anstelle von "JOIN" ... –

+0

Können Sie einige Beispieldaten teilen und das Ergebnis, das Sie dafür erhalten möchten? Es würde uns leichter machen, Ihnen zu helfen. – Mureinik

+0

Sprechen Sie über das Konstrukt ['expr NOT IN (Wert, ...)'] (https://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#function_not-in) ? – axiac

Antwort

1

NOT IN funktioniert, wenn Sie mehrere Werte (mit Komma getrennt in ()) überprüfen möchten. Für einzelne Datensatz passend können Sie verwenden != oder <>

select p.* from project p inner join department d on 
p.department_string_id=d.department_string_id WHERE p.project_owner != 
d.department_head 
1

NOT IN verwendet wird, um zu überprüfen, ob eine Variable in einer Sammlung von Werten vorhanden ist (zB: p.project_owner NOT IN (1,2,3,..) oder NOT IN (SELECT d.department_head FROM department d))

In diesem Fall sollten Sie != anstelle von NOT IN, weil Sie die Werte nacheinander überprüfen.

select p.* 
from project p 
inner join department d on p.department_string_id = d.department_string_id 
WHERE p.project_owner != d.department_head 
0

mit dieser Abfrage Ich glaube, Sie werden erreichen, was Sie

select p.* from project p 
left join department d on 
p.department_string_id=d.department_string_id 
WHERE p.project_owner is null 

btw in oder not in verwendet wird, nicht auf diese Weise wollen. es erhält Werte aus der Sammlung.

+0

Entschuldigung und danke. Irrtümlicherweise habe ich "in" anstelle von "is" geschrieben. Danke nochmal. –

0

Der NOT IN Test gegen eine Reihe von Element nicht nur eine einzige NOT IN (foo, bar, ..). Je nachdem, was Sie erreichen wollen, gibt es zwei Lösungen für Ihr Problem:

  1. Wenn Sie gegen einen Wert testen müssen, können Sie den <> oder != Operator verwenden, um einen einzelnen Wert auszuschließen.

  2. Wenn Sie wollen die ganzedepartment_head Liste ausschließen Sie eine andere Abfrage verwenden können NOT IN (select field_name form table) die Liste zu holen. wie folgt aus:

select p.* from project p inner join department d on p.department_string_id=d.department_string_id WHERE p.project_owner NOT IN (select d.department_head from department d)

0

Verwenden Sie diese Abfrage

select p.* from project p 
    left join department d on 
    p.department_string_id=d.department_string_id 
    WHERE d.department_head is null or d.department_head<>p.project_owner