zenet_logo

-株式会社ゼネット技術ブログ-

PostgreSQLでの副問い合わせ(サブクエリー)における注意点


こんにちは

株式会社ゼネット新人の藤﨑です。

先日SQL文を書く際、副問い合わせにかなり苦戦しました…。
私と同じようにJava初心者の方、副問い合わせで躓いた方に
ぜひ読んでほしいです。

1.はじめに

私は、Java経験が現在3か月の初心者です。
初心者の私が間違えた点を紹介していきます。

2.実際に間違えた具体例

・SELECT句での副問い合わせについて

私が一番間違えた点は、

「副問い合わせで1行を指定しているか」

基本的にSELECT句では1行を取得しなければなりません。
私はSELECT句での副問い合わせで1行を超える行の選択をよくしていました。
今回は2つのテーブルを結合し、副問い合わせをつかってまとめて表示したいと思います。

ここからは具体的にコードを載せていきます。
通常では3つテーブルを用意しますが今回は簡単にするため2つ用意します。

テーブル定義
テーブル内容


今回は全受注のフルーツが何個売れたか、
現在庫量も一緒に表示したいと思います。

下記にコードを示します。

SELECT id,name,price,stock,(SELECT SUM(amount) FROM orders WHERE item_id = item.id) FROM item;

例1)全受注のフルーツが売れた量と在庫量

例1

こんな簡単に書きましたが、私はかなり苦戦しました。
ここからはその際、間違えたコードを提示します。

SELECT id,name,stock,(SELECT amount FROM orders WHERE item_id = item.id) FROM item;

ここでの副問い合わせは1行のみを返すものでなければなりません。
よって正解は、SELECT句の「amount」を「SUM(amount)」にする必要があります。


この記事を読んでくれているあなたが、データの参照(WHERE)についての
理解が浅い、なんとなくテーブル同士の結合をしてSELECT文で
表示をしているのならば、かなり危険です(私自身がそうでした)。


条件付き参照(WHERE)について
詳しく説明するとかなり長くなってしまうので
この記事では割愛させていただきます。

3.おわりに

改めて、SQL文での副問い合わせでの注意点は

「副問い合わせで1行を指定しているか」

複数行を指定しないように気を付けましょう。


いかがだったでしょうか。

最後まで読んでいただきありがとうございました。