Vinzenz Mai: SQL Abfrage, Problem bei Formulierung

Beitrag lesen

Hallo,

Tabelle1
Name   Straße ID

Tabelle2
PLZ Nationalität ID

Mein Problem ist, ich möchte gerade alle Werte aus Tabelle2 angezeigt bekomme die eine ID haben, die nicht mit der aus der Tabelle1 übereinstimmen.

wenn ich Dich richtig verstehe, möchtest Du alle Datensätze aus Tabelle2 haben, deren ID in Tabelle1 nicht auftritt.

Ich hab des so gemacht, aber ich bekomme keine Wert  zurück.

was nicht verwunderlich ist.

» SELECT PLZ Nationalität, tabelle2.ID  

> FROM `Tabelle2` INNER JOIN Tabelle1 ON Tabelle2.id = Tabelle1.ID  
  
-- aus der Kombination jedes Datensatzes aus Tabelle1 mit jedem Datensatz aus  
-- Tabelle2 möchtest Du nur die Datensätze haben, bei denen die Werte in der  
-- Spalte ID übereinstimmen.  
  
-- Das Ergebnis dieser Operation schränkst Du durch die Bedingung ein,  
  

> WHERE Tabelle1.ID != Tabelle2.id;  
  
-- dass die Werte in der Spalte ID unterschiedlich sein müssen.  

Was ist daran falsch

Wie können die Werte in der Spalte ID gleichzeitig gleich und gleichzeitig unterschiedlich sein?

Nochmals zu Deinem Ausgangsproblem:

Gib mir die Werte der Spalten
    PLZ,
    Nationalität
    und ID
aus
    Tabelle2
wobei mich nur die Datensätze interessieren
    deren ID
        nicht in der Liste der IDs aus Tabelle1 vorkommt.

übersetzen wir eins zu eins in SQL:

-- Gib mir die Werte der Spalten  
SELECT  
    PLZ,  
    Nationalität,  
    ID  
-- aus  
FROM  
    Tabelle2  
-- wobei mich nur die Datensätze interessieren  
WHERE  
    -- deren ID nicht in  
    Tabelle2.ID NOT IN (  
        -- der Liste der IDs aus Tabelle1 vorkommt.  
        SELECT Tabelle1.ID FROM Tabelle1  
    )  

oder nicht ganz so intuitiv mit einem OUTER JOIN und dem IS-NULL-Operator

SELECT  
    t2.PLZ,  
    t2.Nationalität,  
    t2.ID  
FROM  
    Tabelle2 t2  
LEFT JOIN  
    Tabelle1 t1  
ON  
    t2.ID = t1.ID  
WHERE  
    t1.ID IS NULL  

Die zweite Version funktioniert auch mit uralten MySQL-Versionen (sprich 4.0 und älter), die ich nicht mehr im produktiven Einsatz sehen möchte, da sie bereits seit Jahren tot sind, d.h. dass es keinerlei Sicherheitsupdates für bekannte kritische Fehler mehr gibt.

Mehr zu Joins findest Du in unseren Datenbankartikeln zu den Joins:

Freundliche Grüße

Vinzenz