【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
まずは解決方法②で修正できないかを考え、無理がある場合、解決方法①を採用するのが良いと思われます。
以上となります。
ここまでお読みいただきありがとうございました。