valor utilizada update una tipos subconsultas subconsulta stuff sola retornó registro otro más mas fila expresión ejemplos devuelve dentro con como columna sql database postgresql subquery dblink

sql - update - Error de Postgres: más de una fila devuelta por una subconsulta utilizada como expresión



tipos de subconsultas sql (5)

El problema fundamental a menudo se puede resolver simplemente cambiando un = a IN , en los casos en que tenga una relación de uno a varios. Por ejemplo, si desea actualizar o eliminar un grupo de cuentas para un cliente determinado:

WITH accounts_to_delete AS ( SELECT account_id FROM accounts a INNER JOIN customers c ON a.customer_id = c.id WHERE c.customer_name=''Some Customer'' ) -- this fails if "Some Customer" has multiple accounts, but works if there''s 1: DELETE FROM accounts WHERE accounts.guid = ( SELECT account_id FROM accounts_to_delete ); -- this succeeds with any number of accounts: DELETE FROM accounts WHERE accounts.guid IN ( SELECT account_id FROM accounts_to_delete );

Tengo dos bases de datos separadas. Estoy tratando de actualizar una columna en una base de datos a los valores de una columna de la otra base de datos:

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));

Este es el error que estoy recibiendo:

ERROR: more than one row returned by a subquery used as an expression

¿Algunas ideas?


El resultado producido por la consulta es que no tiene ninguna de las filas que necesitan un manejo adecuado; este problema se puede resolver si proporciona el controlador válido en la consulta como 1. limitar la consulta para devolver una sola fila 2. esto también se puede hacer proporcionando " seleccione max (columna) "que devolverá la fila individual


Este error significa que la consulta SELECT store_key FROM store ha devuelto dos o más filas en la base de datos SERVER1 . Si desea actualizar todos los clientes, utilice una unión en lugar de un operador escalar = . Necesita una condición para "conectar" a los clientes para almacenar artículos para hacer eso.

Si desea actualizar todas las store_key customer_id en la misma store_key , debe proporcionar una cláusula WHERE al SELECT ejecutado de forma remota para que la consulta devuelva una sola fila.


Esto significa que su SELECT anidado devuelve más de una fila.

Es necesario agregar una cláusula WHERE adecuada a ella.


Técnicamente , para reparar su estado de cuenta, puede agregar LIMIT 1 a la subconsulta para asegurarse de que se devuelva como máximo 1 fila. Eso eliminaría el error, tu código aún sería un disparate.

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

En la práctica , usted quiere hacer coincidir las filas de alguna manera en lugar de elegir una fila arbitraria del store tabla remota para actualizar cada fila de su customer tabla local.
Su pregunta rudimentaria no proporciona suficientes detalles, así que match_name una columna de texto match_name en ambas tablas (y UNIQUE en la store ) por este ejemplo:

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

Pero esa es una manera extremadamente cara de hacer las cosas.

Idealmente , deberías reescribir completamente la declaración .

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;

Esto soluciona una serie de problemas en su declaración original.

  • Obviamente, el problema básico que conduce a su error es corregido.

  • Casi siempre es mejor unir relaciones adicionales en la cláusula FROM de una instrucción UPDATE que ejecutar subconsultas correlacionadas para cada fila individual.

  • Cuando se usa dblink, lo anterior se vuelve mil veces más importante. No desea llamar a dblink() para cada fila, eso es extremadamente costoso . Llámalo una vez para recuperar todas las filas que necesites.

  • Con las subconsultas correlacionadas, si no se encuentra una fila en la subconsulta, la columna se actualiza a NULL, que casi siempre no es lo que desea.
    En mi formulario actualizado, la fila solo se actualiza si se encuentra una fila coincidente. Si no, la fila no se toca.

  • Normalmente, no querría actualizar las filas, cuando nada cambia realmente. Eso no es costoso hacer nada (pero aún produce filas muertas). La última expresión en la cláusula WHERE evita tales actualizaciones vacías :

    AND c.customer_id IS DISTINCT FROM sub.store_key