Ich habe 2 Tabellen, ich möchte die 1 Tabelle filtern, bevor die 2 Tabellen zusammengefügt werden.
Kundentabelle:
╔══════════╦═══════╗
║ Customer ║ State ║
╠══════════╬═══════╣
║ A ║ S ║
║ B ║ V ║
║ C ║ L ║
╚══════════╩═══════╝
Eintragstabelle:
╔══════════╦═══════╦══════════╗
║ Customer ║ Entry ║ Category ║
╠══════════╬═══════╬══════════╣
║ A ║ 5575 ║ D ║
║ A ║ 6532 ║ C ║
║ A ║ 3215 ║ D ║
║ A ║ 5645 ║ M ║
║ B ║ 3331 ║ A ║
║ B ║ 4445 ║ D ║
╚══════════╩═══════╩══════════╝
Ich möchte Links beitreten, damit ich alle Datensätze aus der Kundentabelle erhalte, unabhängig davon, ob die Eintragstabelle verwandte Datensätze enthält. Ich möchte jedoch vor dem Join nach Kategorie D in der Eintragstabelle filtern .
Gewünschten Erfolge:
╔══════════╦═══════╦═══════╗
║ Customer ║ State ║ Entry ║
╠══════════╬═══════╬═══════╣
║ A ║ S ║ 5575 ║
║ A ║ S ║ 3215 ║
║ B ║ V ║ 4445 ║
║ C ║ L ║ NULL ║
╚══════════╩═══════╩═══════╝
Wenn ich folgende Abfrage machen würde:
SELECT Customer.Customer, Customer.State, Entry.Entry
FROM Customer
LEFT JOIN Entry
ON Customer.Customer=Entry.Customer
WHERE Entry.Category='D'
Dies würde den letzten Datensatz herausfiltern.
Ich möchte also, dass alle Zeilen aus der linken Tabelle in die nach Kategorie D gefilterte Eintragstabelle eingefügt werden.
Vielen Dank für jede Hilfe im Voraus!
sql
join
filter
where-clause
Tom Jenkin
quelle
quelle
Antworten:
Sie müssen den
WHERE
Filter in dieJOIN
Bedingung verschieben:SELECT c.Customer, c.State, e.Entry FROM Customer c LEFT JOIN Entry e ON c.Customer=e.Customer AND e.Category='D'
Siehe SQL Fiddle mit Demo
quelle
Sie könnten auch tun:
SELECT c.Customer, c.State, e.Entry FROM Customer AS c LEFT JOIN (SELECT * FROM Entry WHERE Category='D') AS e ON c.Customer=e.Customer
SQL Fiddle hier
quelle
Oder...
SELECT c.Customer, c.State, e.Entry FROM Customer c LEFT JOIN Entry e ON c.Customer=e.Customer WHERE e.Category IS NULL or e.Category='D'
quelle
EXPLAIN
dass MySql diese Abfrage tatsächlich nur geringfügig besser optimiert als die in Taryns Antwort, obwohl dies sicherlich mehr Glück als das Management bedeutet und das Gegenteil für eine andere Engine durchaus zutreffen könnte.