Технически , за да поправите извлечението си, можете да добавите 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, горното става хиляди пъти по-важно. Не искате да извикате dblink()
за всеки отделен ред това е изключително скъпо . Извикайте го веднъж, за да извлечете всички редове, от които се нуждаете.
С корелирани подзаявки, ако не е намерен ред в подзаявката колоната се актуализира до NULL, което почти винаги не е това, което искате. В моята актуализирана заявка редът се актуализира само ако се намери съвпадащ ред. В противен случай редът не се докосва.
Обикновено не бихте искали да актуализирате редове, когато всъщност нищо не се променя. Това е скъпо да не правите нищо (но все пак създава мъртви редове). Последният израз в WHERE
клаузата предотвратява подобни празни актуализации :
AND c.customer_id IS DISTINCT FROM sub.store_key
Свързано:
- Как да (или мога) да ИЗБЕРЯ DISTINCT за няколко колони?