kazu22002の技術覚書

PHPer, Golang, AWS エンジニアの日々

SQLのサブクエリではまっている

SQLが弱点であることに気がついた最近だが、そんなすぐに成長するわけではない。

ということでかなりドツボにハマッている状態になっています。

使用しているのはPostgresを使用しています。

サブクエリを使用してパフォーマンス低下

サブクエリ(副問い合わせ)は重いらしい。

サブクエリにも種類があるみたいですね。相関サブクエリとか。

このあたりからよくわかってはいませんが、サブクエリが便利なのは実感している。

使っちゃうよ。。。

どのあたりで重くなっているかと予想をいろいろ繰り返している。

SQLの書き方で苦戦

たとえば、

Companyテーブル

  • id
  • name

Bookテーブル

  • id
  • name
  • company_id

正常

SELECT c.id, 
       (SELECT count(b.id) 
          FROM Book b
          WHERE b.company_id = c.id 
          GROUP BY b.id) AS count
  FROM Company c
  WHERE c.id = 10;

エラー

SELECT c.id, b.count
  FROM Company c
  INNER JOIN (SELECT count(b.id) 
                FROM Book b
                WHERE b.company_id = c.id
                GROUP BY b.id) AS b
          ON b.company_id = c.id
  WHERE c.id = 10;

・・・いい例が思いつかないのです。

言いたいことは、WHERE文の「c.id」について。

サブクエリの中で書いているのは同じ。 ただし宣言がされていないとエラーになる。 この辺りでどうかけばいいのかわからず定数を指定してしまったりした。。。。

初心者だとできることでしか書かないから悲劇を招く可能性がとても高い。。。

だがチャレンジはする。。。チャレンジしている間は大丈夫そうなので、迷惑はかけるけど、頑張っている状態。。。

まぁ、なにがこのSQLだとFROM句でサブクエリを書いているため指定ができないのではないかと。

WHEREやSELECTでは書くことができる。

SQLの処理順が影響していると思われる。

SQL処理順

kaya-soft.com

SQLの魔術: Javaの日々

いろいろみている状態。。。

FROM句が一番はじめですね。

この当たりだな。原因は!!

FROM句のあとだから、WHEREやSELECTでは指定ができると!!

SELECTでのサブクエリはORDERで使用できるが、WHEREでは効果を発揮できない。

これは処理順を理解しないとしっかりとした処理をかけないことを認識させられますね。

難しいですね。

理解しながらすこしずつ書いてみます。

(今回のSQLを実行はしていないので、元からエラーがもしれません。すみません。)

達人に学ぶ SQL徹底指南書 (CodeZine BOOKS)

達人に学ぶ SQL徹底指南書 (CodeZine BOOKS)