2016-09-23 6 views
0

Möglicherweise versehentlich auf eine gute SQL-Testfrage gestolpert.SQL LEFT JOIN where-Klausel mit IN-Vergleich

  • Ich habe eine Tabelle mit sagen wir ~ 100 Benutzernamen.
  • Ich habe eine Reihe von 10 möglichen Benutzernamen {aname, bname, cname, dname, ...}

Wenn ich tun:

SELECT user.username FROM user WHERE user.username IN ('aname', 'bname', 'cname',...); 

ich eine Liste von Benutzernamen für ausgewählte bekommen, minus die nicht in der Tabelle gefundenen, großartig.

Was ich eigentlich will, ist eine Liste der NICHT in der Tabelle gefundenen.

Wenn die WHERE...IN Klausel Liste eine Tabelle war, würde ich nur LEFT JOIN es auf die Benutzertabelle und Filter für NULLs.

Gibt es eine Möglichkeit, dies zu tun, ohne eine temporäre Tabelle zu erstellen, und die Verbindung zur Benutzertabelle zu verlassen? Ich denke, eine Art linker Join der Benutzertabelle zur WHERE...IN Klausel?

Ich habe es noch nie getan oder gesehen, aber vielleicht existiert es.

+0

yey vielleicht brauchen Sie nicht in – Beginner

Antwort

1

Sie können dies tun mit einer abgeleiteten Tabelle und ein left join:

SELECT l.name 
FROM (SELECT 'aname' as name UNION ALL 
     SELECT 'bname' UNION ALL 
     SELECT 'cname' UNION ALL 
     . . . 
    ) l LEFT JOIN 
    user u 
    ON u.username = l.name 
WHERE u.username IS NULL 
+0

Wir haben einen Gewinner! – eromlige

+0

Ich habe einen Fehler "gemischte Sortierungen" gefunden.
Ich habe einen BINARY Cast zum Vergleich hinzugefügt. SELECT l.name FROM (SELECT 'aname' als Namen UNION ALL SELECT 'bname' UNION ALL 'CNAME' UNION ALL SELECT 'dname' SELECT) l LEFT JOIN Benutzer U ON BINARY u .username = BINARY l.name WHERE u.username ist NULL' – eromlige