【PostgreSQL】SQLのエラー「式として使用された副問い合わせが2行以上の行を返しました」を解決する

SQLエラーのコードとしては「21000」の解決方法となります。

SQLのエラー「式として使用された副問い合わせが2行以上の行を返しました」を解決

今回使用した環境

インターネット接続可能のオンラインの環境

64 ビット オペレーティング システム

Windows 10 22H2

PostgreSQL 14.4

状況を再現してみる

以下のようなテーブル「test_table」を用意しました。

このテーブルの「test_number」には「test_code」を数字に直した数 x 100の値が格納されている仕様を前提とします。

このような要件が実際にあるかどうかは別として、SELECTの結果で「test_number」の最大値の列「test_number_max」を取得することを考えてみます。

以下のようなSQLを考えてみました。

  SELECT test_code, test_name, test_date, test_number
        ,(SELECT test_number FROM test_table 
          ORDER BY test_code DESC) AS test_number_max
    FROM test_table
ORDER BY test_code

実行してみると、エラーが再現できました。

「式として使用された副問い合わせが2行以上の行を返しました」のエラーが発生しました。

原因は「test_number_max」を取得するための副問い合わせ ( サブクエリ ) が複数行の結果を返していることが原因となります。

この場合、副問い合わせの結果は必ず1行以下 ( 0行でもSQLエラーとはならない ) としなければなりません。

解決方法① 「LIMIT 1」を指定する

「test_number_max」取得時の副問い合わせに「LIMIT 1」を指定しています。

  SELECT test_code, test_name, test_date, test_number
        ,(SELECT test_number FROM test_table
          ORDER BY test_code DESC LIMIT 1) AS test_number_max
    FROM test_table
ORDER BY test_code

「LIMIT 1」を指定すると副問い合わせの結果の1行目のみが、結果として返されるのでエラーを解決することができます。

※「LIMIT 1」を指定してエラーを解決する場合、「ORDER BY」の指定も基本的には必須となります。

解決方法②「MAX」を指定する

基本的な解決方法はこちらでしょう。

副問い合わせで「MAX」を指定して最大値を取得しています。「GROUP BY」なしで「MAX」を指定した場合、必ず副問い合わせの結果は1件となるのでエラー解決できます。

  SELECT test_code, test_name, test_date, test_number
        ,(SELECT MAX(test_number) FROM test_table) AS test_number_max
    FROM test_table
ORDER BY test_code

以上となります。

ここまでお読みいただきありがとうございました。

PostgreSQL

Posted by だゆう