技術的に 、ステートメントを修復するには、 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を選択するにはどうすればよいですか(またはできますか?