PostgreSQL
 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, горното става хиляди пъти по-важно. Не искате да извикате dblink() за всеки отделен ред това е изключително скъпо . Извикайте го веднъж, за да извлечете всички редове, от които се нуждаете.

С корелирани подзаявки, ако не е намерен ред в подзаявката колоната се актуализира до NULL, което почти винаги не е това, което искате. В моята актуализирана заявка редът се актуализира само ако се намери съвпадащ ред. В противен случай редът не се докосва.

Обикновено не бихте искали да актуализирате редове, когато всъщност нищо не се променя. Това е скъпо да не правите нищо (но все пак създава мъртви редове). Последният израз в WHERE клаузата предотвратява подобни празни актуализации :

     AND   c.customer_id IS DISTINCT FROM sub.store_key

Свързано:

  • Как да (или мога) да ИЗБЕРЯ DISTINCT за няколко колони?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Самопредоставяне на потребителски акаунти в PostgreSQL чрез непривилегирован анонимен достъп

  2. Получаване на въведени резултати от необработен SQL ActiveRecord

  3. Улесняване на управлението на производствена PostgreSQL база данни

  4. Свържете параметъра на масива към собствената заявка

  5. PostgreSQL деактивира повече изход