sql >> データベース >  >> RDS >> PostgreSQL

Postgresエラー:式として使用されるサブクエリによって返される複数の行

    技術的に 、ステートメントを修復するには、 LIMIT 1を追加します サブクエリに追加して、最大1行が返されるようにします。それはエラーを取り除くでしょう、あなたのコードはまだナンセンスです。

    ... 'SELECT store_key FROM store LIMIT 1' ...

    実質的に 、行を一致させたいどういうわけか リモートテーブルのstoreから任意の行を選択する代わりに ローカルテーブルのすべての行を更新するにはcustomer
    あなたの基本的な質問は十分な詳細を提供していないので、私は仮定します テキスト列match_name 両方のテーブル(およびUNIQUE storeで )この例のために:

    ... 'SELECT store_key FROM store
         WHERE match_name = ' || quote_literal(customer.match_name)  ...

    しかし、それは非常に費用のかかる方法です。

    理想的には 、ステートメントを完全に書き直します。

    UPDATE customer c
    SET    customer_id = s.store_key
    FROM   dblink('port=5432, dbname=SERVER1 user=postgres password=309245'
                , 'SELECT match_name, store_key FROM store')
           AS s(match_name text, store_key integer)
    WHERE c.match_name = s.match_name
    AND   c.customer_id IS DISTINCT FROM s.store_key;
    

    これにより、元のステートメントの多くの問題が解決されます。

    明らかに、基本的な問題 エラーの原因は修正されました。

    通常、FROMで追加の関係に参加することをお勧めします UPDATEの句 相関サブクエリを実行するよりもステートメント 個々の行ごとに。

    dblinkを使用する場合、上記は1000倍重要になります。 dblink()を呼び出さないでください すべての行について、それは非常に高価です 。一度呼び出すと、必要なすべての行が取得されます。

    相関サブクエリで、行が見つからない場合 サブクエリでは、列がNULLに更新されますが、これはほとんどの場合、必要なものではありません。更新されたクエリでは、一致する行が見つかった場合にのみ行が更新されます。それ以外の場合、行は変更されません。

    通常、実際には何も変更されていないのに、行を更新することは望ましくありません。それは費用のかかる何もしません(しかし、それでもデッドローを生成します)。 WHEREの最後の式 句は、そのような空の更新を防ぎます :

         AND   c.customer_id IS DISTINCT FROM sub.store_key
    

    関連:

    • 複数の列でDISTINCTを選択するにはどうすればよいですか(またはできますか?


    1. MySQLWorkbenchを使用したMySQLデータベースのリバースエンジニアリング

    2. MySQL SOUNDEX()の例

    3. phpを使用してtxtファイルをpostgresにインポートする際の問題

    4. MySQLデータベースにデータを挿入する