Postgres Erreur: Plus d'une ligne renvoyée par une sous-requête en tant qu'expression
J'ai deux bases de données distinctes. Je suis en train de mettre à jour une colonne dans une base de données pour les valeurs d'une colonne à partir de la base de données:
UPDATE customer
SET customer_id=
(SELECT t1 FROM dblink('port=5432, dbname=SERVER1 user=postgres password=309245',
'SELECT store_key FROM store') AS (t1 integer));
C'est l'erreur que je reçois:
ERROR: more than one row returned by a subquery used as an expression
Des idées?
Quel effet ont été vous essayez d'atteindre avec cette
UPDATE
?OriginalL'auteur user3182502 | 2014-01-10
Vous devez vous connecter pour publier un commentaire.
Techniquement, à la réparation de votre déclaration, vous pouvez ajouter
LIMIT 1
de la sous-requête pour assurer qu'au plus 1 ligne est renvoyée. Afin de supprimer l'erreur, votre code devrait toujours être absurde.Pratiquement, vous voulez correspondre les lignes en quelque sorte au lieu de l'arbitraire de la sélection d'une ligne de la table distante
store
de mettre à jour à chaque ligne de votre table localecustomer
.Votre rudimentaire question ne fournissent pas suffisamment de détails, donc je suis en supposant une colonne de texte
match_name
dans les deux tables (etUNIQUE
dansstore
) pour les besoins de cet exemple:Mais c'est extrêmement coûteux façon de faire les choses.
Idéalement, vous devriez réécrire complètement la déclaration.
Ce recours à un certain nombre de problèmes dans votre déclaration d'origine.
Évidemment, la problème de base menant à votre erreur est corrigée.
Il est presque toujours préférable de se joindre à des relations supplémentaires dans le
DE
de la clause d'unUPDATE
déclaration que de courir sous-requêtes corrélées pour chaque ligne individuelle.Lors de l'utilisation de dblink, le ci-dessus devient mille fois plus important. Vous ne voulez pas appeler
dblink()
pour chaque ligne, c'est extrêmement coûteux. De l'appeler une fois pour récupérer toutes les lignes dont vous avez besoin.Avec des sous-requêtes corrélées, si aucune ligne n'est trouvé dans la sous-requête, la colonne est mise à jour à NULL, ce qui est presque toujours pas ce que vous voulez.
Dans mon formulaire mis à jour, la ligne est mise à jour si une ligne correspondante est trouvée. Sinon, la ligne n'est pas touché.
Normalement, vous ne voulez pas mettre à jour des lignes, si rien ne change réellement. C'est cher, ne rien faire (mais produit toujours de la mort de lignes). La dernière expression dans le
WHERE
clause empêche que de tels vide mises à jour:OriginalL'auteur Erwin Brandstetter
Cela signifie que votre imbriquée SÉLECTIONNEZ renvoie plusieurs lignes.
Vous avez besoin d'ajouter un bonne clause where.
OriginalL'auteur peter.petrov
Cette erreur signifie que le
SELECT store_key FROM store
requête a retourné deux ou plusieurs lignes dans leSERVER1
base de données. Si vous souhaitez mettre à jour tous les clients, l'utilisation d'une jointure à la place d'un scalaire=
de l'opérateur. Vous avez besoin d'une condition de "connecter" les clients de stocker les éléments dans l'ordre pour le faire.Si vous souhaitez mettre à jour tous les
customer_id
s à la mêmestore_key
, vous devez fournir uneWHERE
clause de l'exécution à distanceSELECT
de sorte que la requête retourne une seule ligne.OriginalL'auteur dasblinkenlight
Le résultat produit par la Requête est ne pas avoir de lignes qui ont besoin d'une bonne manipulation de ce problème peut être résolu si l'on valide gestionnaire dans la requête comme
1. la limitation de la requête retourne une seule ligne
2. cela peut aussi être fait en fournissant "select max(colonne)" qui sera de retour à la ligne
OriginalL'auteur user10101
Le problème fondamental qui peuvent souvent être simplement résolu en changeant un
=
àIN
, dans le cas où vous avez un un-à-plusieurs relations. Par exemple, si vous souhaitez mettre à jour ou supprimer un tas de comptes, pour un client donné:OriginalL'auteur rotarydial