2013-02-25 7 views
46

Ho 2 tabelle, voglio filtrare il 1 tavolo prima del i 2 tavoli sono uniti insieme.Tabella filtri prima di applicare a sinistra Join

Tabella

clienti:

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

voce della tabella:

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

OK Voglio LEFT JOIN in modo da ottenere tutti i record dalla tabella cliente indipendentemente dal record se ci sono correlati nella tabella Entry . Tuttavia voglio filtrare sulla categoria D nella tabella di immissione prima del join.

risultati desiderati:

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

Se dovessi fare la seguente query:

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

Ciò filtrare l'ultimo record.

quindi voglio tutte le righe della tabella a sinistra, e si uniscono al tavolo di entrata filtrato sulla categoria D.

Grazie a qualsiasi aiuto in anticipo !!

risposta

56

è necessario spostare il filtro WHERE al JOIN condizione:

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

Vedi SQL Fiddle with Demo

+0

Wow sei veloce ed efficiente! Questo fa il trucco, grazie per l'aiuto! –

+0

Fatto :) Grazie ancora –

+4

@TomJenkin grazie, tra l'altro hai postato una fantastica prima domanda sul sito. Un sacco di dettagli, ecc. – Taryn

14

Si potrebbe anche fare:

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 here

+1

Anche questo funziona come alternativa! Qual è il metodo preferito? –

+1

@ TomJenkin Ci scusiamo per la risposta tardiva, sono stato lontano dal computer per tutto questo tempo. Per curiosità, però, ho eseguito entrambe le operazioni e controllato i piani di esecuzione. I piani di esecuzione sono quasi identici, ma nella misura in cui è meglio, sembra che sia la versione di Bluefeet. –