web-dev-qa-db-fra.com

Filtrer la table avant d'appliquer la jointure gauche

J'ai 2 tables, je veux filtrer la table 1 avant les 2 tables sont jointes.

Tableau client:

    ╔══════════╦═══════╗
    ║ Customer ║ State ║
    ╠══════════╬═══════╣
    ║ A        ║ S     ║
    ║ B        ║ V     ║
    ║ C        ║ L     ║
    ╚══════════╩═══════╝

Table d'entrée:

   ╔══════════╦═══════╦══════════╗
   ║ Customer ║ Entry ║ Category ║
   ╠══════════╬═══════╬══════════╣
   ║ A        ║  5575 ║ D        ║
   ║ A        ║  6532 ║ C        ║
   ║ A        ║  3215 ║ D        ║
   ║ A        ║  5645 ║ M        ║
   ║ B        ║  3331 ║ A        ║
   ║ B        ║  4445 ║ D        ║
   ╚══════════╩═══════╩══════════╝

OK, je souhaite joindre à gauche afin d'obtenir tous les enregistrements de la table Client, qu'il y ait ou non des enregistrements liés dans la table Entrée. Cependant, je souhaite filtrer la catégorie D dans la table d’entrée avant la jointure .

Les résultats souhaités:

   ╔══════════╦═══════╦═══════╗
   ║ Customer ║ State ║ Entry ║
   ╠══════════╬═══════╬═══════╣
   ║ A        ║ S     ║  5575 ║
   ║ A        ║ S     ║  3215 ║
   ║ B        ║ A     ║  4445 ║
   ║ C        ║ L     ║  NULL ║
   ╚══════════╩═══════╩═══════╝

Si je devais faire la requête suivante:

   SELECT Customer.Customer, Customer.State, Entry.Entry
   FROM Customer
   LEFT JOIN Entry
   ON Customer.Customer=Entry.Customer
   WHERE Entry.Category='D'

Cela filtrerait le dernier enregistrement.

Je souhaite donc que toutes les lignes de la table de gauche soient jointes à la table d’entrée filtrée dans la catégorie D.

Merci à toute aide à l'avance!

53
Tom Jenkin

Vous devez déplacer le filtre WHERE vers la condition JOIN:

SELECT c.Customer, c.State, e.Entry
FROM Customer c
LEFT JOIN Entry e
   ON c.Customer=e.Customer
   AND e.Category='D'

Voir SQL Fiddle avec Demo

77
Taryn

Vous pouvez aussi faire:

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 ici

18
Jeff Rosenberg

Ou...

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'
0
c z