エキサイトのしばたにえんです。 sqlのWITH句をこないだ初めて使いましたのでその使い方を紹介いたします。
- Sql Server
- MySQL (8.0以降)
- PostgreSQL
- Oracle Database (12c以降)
- Maria DB (10.2.1以降)
でWITH句を使用することができます。
使い方
以下のような商品販売テーブル(sales)があるとします
code | sales_date | item_count |
---|---|---|
A00003 | 2021-05-17 10:30:00.000 | 2 |
A00001 | 2021-05-17 10:20:00.000 | 3 |
A00002 | 2021-05-17 10:15:00.000 | 3 |
A00003 | 2021-05-17 10:10:00.000 | 4 |
A00001 | 2021-05-17 10:08:00.000 | 3 |
A00002 | 2021-05-17 10:05:00.000 | 3 |
A00001 | 2021-05-17 10:03:00.000 | 3 |
SELECT * FROM sales;
このテーブルにcode毎にitem_countを合計した値も追加して取得する必要があるとします。
code | sales_date | item_count | sum_count |
---|---|---|---|
A00003 | 2021-05-17 10:30:00.000 | 2 | 6 |
A00001 | 2021-05-17 10:20:00.000 | 3 | 9 |
A00002 | 2021-05-17 10:15:00.000 | 3 | 6 |
A00003 | 2021-05-17 10:10:00.000 | 4 | 6 |
A00001 | 2021-05-17 10:08:00.000 | 3 | 9 |
A00002 | 2021-05-17 10:05:00.000 | 3 | 6 |
A00001 | 2021-05-17 10:03:00.000 | 3 | 9 |
-- WITH句を使わない場合 SELECT sales.*, sum_count FROM sales JOIN ( SELECT SUM(item_count) AS sum_count, code FROM sales GROUP BY code ) AS sub_sales ON sales.code = sub_sales.code;
これで取得することができますが、 JOIN句の中に、SELECT句があるので読みにくいです。
WITH句を使った場合
-- WITH句を使う場合 WITH alias AS ( SELECT SUM(item_count) AS sum_count, code FROM sales GROUP BY code ) SELECT sales.*, alias.sum_count FROM sales JOIN alias ON sales.code = alias.code
WITH句にあるSQL文は、その後のSELECT句より先に実行されます。 WITH句を使わない場合に比べ、JOINにあるSELECT句が外に出るので見やすくなっています。
使う機会があれば使ってみるといいかもしれません。