[sql] 왼쪽 조인을 적용하기 전에 테이블 필터링

2 개의 테이블이 있는데 2 개의 테이블이 결합 되기 전에 1 개의 테이블을 필터링하고 싶습니다 .

고객 테이블 :

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

엔트리 테이블 :

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

Entry 테이블에 관련 레코드가 있는지 여부에 관계없이 Customer 테이블에서 모든 레코드를 가져 오도록 Left Join을 원합니다. 그러나 조인 전에 항목 테이블에서 범주 D를 필터링하고 싶습니다 .

원하는 결과 :

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

다음 쿼리를 수행하는 경우 :

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

이것은 마지막 레코드를 필터링합니다.

따라서 왼쪽 테이블의 모든 행을 카테고리 D로 필터링 된 항목 테이블에 조인합니다.

사전에 도움을 주셔서 감사합니다!



답변

WHERE필터를 JOIN조건 으로 이동해야합니다 .

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

데모로 SQL Fiddle 보기


답변

다음을 수행 할 수도 있습니다.

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


답변

또는…

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'


답변