次のようなテーブルがあります。
| id | order_id | product_id | category_id |name | cost | returned_product_id |
| 3100 | 900 | 0125 | 3 | Foo | 14 | NULL |
| 3101 | 901 | 0145 | 3 | Bar | 10 | NULL |
| 3102 | 901 | 2122 | 3 | Baz | 11 | NULL |
| 3103 | 900 | 0125 | 3 | Foo | -14 | 3100 |
| 3104 | 902 | 0125 | 3 | Foo | 14 | NULL |
| 3105 | 902 | 0125 | 3 | Foo | -14 | 3104 |
| 3106 | 903 | 0125 | 3 | Foo | 14 | NULL |
id は、product_id が含まれていた注文の単一の項目です。製品が返品されると、新しい ID で新しい項目が作成されます。各商品1点ずつあり、返品された商品を再度購入し、再度返品することが可能です。
特定の条件下で、テーブル データを他のテーブルのデータと結合しています。最後の条件として、最初に返品された項目を除外しようとしています。これは、次のように、これまでに購入し、返されていないすべての product_id を本質的に提供する単一のクエリを実行しようとしています。
select product_id
from orders o,
line_items i
where o.state = 'paid'
and o.id = i.order_id
and i.category_id = 3
and i.product_id not in (select li.returned_product_id
from line_items li
where li.refunded_product_id is not null
and li.product_id = 3)
id と return_product_id の両方にインデックスがありますが、上記のクエリは非常に遅く (数千行)、サブセレクトが id をクエリした場合は高速です。