94

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テーブルからすべてのレコードを取得します。ただし、結合する前に、エントリテーブルのカテゴリ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でフィルタリングされたエントリテーブルに結合します。

よろしくお願いします!!

4

3 に答える 3

135

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 を参照してください

于 2013-02-25T21:45:27.117 に答える
29

You could also do:

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

于 2013-02-25T21:49:47.753 に答える