3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

WHERE句で絞り込んでから結合する方法

Posted at

多対多の関係を持つ下記のER図を例に説明します。

hasmany_table.png

課題

Itemsテーブルの全レコードを列挙して、ある特定のCustomerの「買った・買っていない」を表示したい場合、SQLでどんなクエリを発行するのか悩みました。

失敗作

単に結合すると、全てのCustomerの購入履歴が表示されてしまいます。

sqlite> SELECT * FROM Items LEFT OUTER JOIN 
    Orders ON Items.id = Orders.item_id; 

結合のみ.png

テーブルを結合した後にWHERE句で絞り込むと、指定したCustomerが購入したItemは表示されますが、購入していないItemは表示されません。

sqlite> SELECT * FROM Items LEFT OUTER JOIN 
    Orders ON Items.id = Orders.item_id WHERE Orders.customer_id = 1;

結合して絞り込み.png

解決策

サブクエリ(副問い合わせ)を使うことで解決できました。
サブクエリでOrdersをWHERE句で、特定のCustomerに絞り込んでから結合します。

sqlite> SELECT * FROM Items LEFT OUTER JOIN 
    (SELECT * FROM Orders WHERE customer_id = 1) o ON Items.id = o.item_id;

絞り込んでから結合.png

まとめ

ActiveRecordのようなORMを使うと簡単に扱えるhas-manyの関係ですが、SQLで扱うのは少し難しいです。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?