2013-02-25 8 views
46

Mam 2 tabele, chcę filtrować 1 tabelę przed 2 tabele są połączone.Tabela filtrów przed zastosowaniem Left Join

Tabela

klienta:

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

Tabela aktu:

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

OK Chcę LEFT JOIN więc uzyskać wszystkie rekordy z tabeli klientów, niezależnie od tego, czy są związane rekordy w tabeli Entry . Jednak chcę filtrować kategorię D w tabeli wejściowej przed połączeniem.

Pożądane Wyniki:

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

Gdybym miał wykonać następujące zapytanie:

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

To odfiltrowywują ostatni rekord.

Więc chcę wszystkie wiersze z lewej tabeli i dołączyć go do tabeli wejściowej przefiltrowanej od kategorii D.

Dzięki wszelką pomoc z góry !!

Odpowiedz

56

Trzeba przesunąć filtr WHERE do stanu JOIN:

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

Zobacz SQL Fiddle with Demo

+0

Wow jesteś szybkie i wydajne! To robi lewę, dzięki za pomoc! –

+0

Zrobione :) Jeszcze raz dziękuję –

+4

@ TomJenkin dziękuje, przy okazji, zamieściłeś fantastyczne pierwsze pytanie na stronie. Wiele szczegółów, itp. – Taryn

14

Można również zrobić:

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

To również działa jako alternatywa! Czy jest jakaś metoda preferowana? –

+1

@ TomJenkin Przepraszam za spóźnioną reakcję, przez cały czas byłem z dala od komputera. Jednak z ciekawości przebiegłem obie te rzeczy i sprawdziłem plany wykonania. Plany wykonania są niemal identyczne, ale w zakresie, w którym jest albo lepszy, wydaje się, że jest to wersja Bluefeeta. –