クエリの比較
SQLにおいては全く同じ結果を返すのであってもその検索結果が異なるということはよくあります。
例えば下記のようなテーブルがあった場合
co_cd | district
——-+———-
001 | A
002 | B
003 | C
004 | D
co_cd | shop_id | emp_nbr | main_flg
——-+———+———+———-
001 | 1 | 300 | Y
001 | 2 | 400 | N
001 | 3 | 250 | Y
002 | 1 | 100 | Y
002 | 2 | 20 | N
003 | 1 | 400 | Y
003 | 2 | 500 | Y
003 | 3 | 300 | N
003 | 4 | 200 | Y
004 | 1 | 999 | Y
各会社ごとにメインの事業所(main_flg=’Y’)の emp_nbrを出し合い場合、結合で出す場合とサブクエリでテーブル自体を作ってしまってそこから組み立てる2通りの方法があります。
この場合、後者のサブクエリのほうが対象となる絞り込みテーブルが少ないこともあり、高速です。
※詳しくは実行計画をみないとわかりません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
SELECT companies.co_cd, companies.district, SUM(shops.emp_nbr) AS summary FROM shops INNER JOIN companies ON companies.co_cd = shops.co_cd WHERE shops.main_flg = 'Y' GROUP BY companies.co_cd ORDER BY companies.co_cd |
概してサブクエリのほうがスピードがあるようです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
--先にテーブルを構築 SELECT companies.district, T1.summary FROM companies INNER JOIN (SELECT shops.co_cd, SUM(shops.emp_nbr) AS summary FROM shops WHERE shops.main_flg = 'Y' GROUP BY shops.co_cd ORDER BY shops.co_cd ) T1 ON companies.co_cd = T1.co_cd |