2011-05-15 10 views
6

Tengo una tabla "queued_items". Los "user_id" y "item_id" actuales son incorrectos, pero se almacenan en las otras tablas: users.imported_id y items.imported_idError: ERROR: nombre de tabla especificado más de una vez

Intentando tomar import_id de las otras tablas y actualizar. Esto es lo que he intentado

UPDATE queued_items 
SET queued_items.user_id = users.id, 
    queued_items.item_id = items.id 
FROM queued_items 
INNER JOIN users ON queued_items.user_id = users.imported_id 
INNER JOIN items ON queued_items.item_id = items.imported_id 

conseguir este error:

Error : ERROR: table name "queued_items" specified more than once 

intentado quitar la línea De, dio este mensaje:

Error : ERROR: syntax error at or near "INNER" 
LINE 4: INNER JOIN users ON queued_items.user_id = users.imported_id 
     ^

También probé la adición de un alias para el FROM y unirse condiciones

UPDATE queued_items 
SET queued_items.user_id = users.id, 
    queued_items.item_id = items.id 
FROM queued_items as qi 
INNER JOIN users ON qi.user_id = users.imported_id 
INNER JOIN items ON qi.item_id = items.imported_id 

Consiguió este error:

Error : ERROR: column "queued_items" of relation "queued_items" does not exist 
LINE 2: SET queued_items.user_id = users.id, 
      ^

¿Alguna idea? (postgres 9)

PS Tratando de evitar este sub-consulta:

UPDATE queued_items 
SET user_id = (SELECT id FROM users WHERE queued_items.user_id = users.imported_id), 
    item_id = (SELECT id FROM items WHERE queued_items.item_id = items.imported_id) 

... porque es una locura lenta

+0

¿Ha intentado utilizar un alias para 'queued_items' en la cláusula' FROM' y las condiciones de unión? –

+0

Acabo de probar eso. Actualizaré mi publicación con los resultados. – jmccartie

+1

Elimina 'queued_items' de ambas partes de la cláusula' SET', está esperando que los lados izquierdos siempre se refieran solo a las columnas de la tabla que estás actualizando. –

Respuesta

6

Prueba esto:

UPDATE queued_items 
SET user_id = users.id, 
    item_id = items.id 
FROM users, items 
WHERE queued_items.user_id = users.imported_id 
    AND queued_items.item_id = items.imported_id 

Sí, la vieja escuela se unen condiciones.

+0

Error: ERROR: la columna "queued_items" de la relación "queued_items" no existe – jmccartie

+0

@jmccartie: Creo que arreglé el SQL. Por favor prueba mi versión actualizada –

-3

No es necesario la cláusula FROM. Elimina "FROM queued_items" y listo.

+1

Se ha eliminado la línea -> Error: ERROR: error de sintaxis en "INNER" o cerca de ella LINEA 4: usuarios de INNER JOIN ON queued_items.user_id = users.imported_id (actualizaré la publicación con ese error) ^ – jmccartie

-1

Debería poder cambiar el nombre después del UPDATE al alias. También puede usar los nombres con alias en la cláusula set. Esto significa que también puede configurarlos en sus cláusulas JOIN.

UPDATE qi 
SET qi.user_id = us.id, 
    qi.item_id = itms.id 
FROM queued_items qi 
INNER JOIN users us ON qi.user_id = us.imported_id 
INNER JOIN items itms ON qi.item_id = itms.imported_id 
+1

Error : ERROR: la relación "qi" no existe – jmccartie

5

From postgres site

UPDATE [ ONLY ] table [ [ AS ] alias ] 
    SET { column = { expression | DEFAULT } | 
      (column [, ...]) = ({ expression | DEFAULT } [, ...]) } [, ...] 
    [ FROM from_list ] 
    [ WHERE condition | WHERE CURRENT OF cursor_name ] 
    [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ] 

* * from_list

A list of table expressions, allowing columns from other tables to appear in the WHERE condition and the update expressions. This is similar to the list of tables that can be specified in the FROM Clause of a SELECT statement. Note that the target table must not appear in the from_list, unless you intend a self-join (in which case it must appear with an alias in the from_list).

+0

¿Un ejemplo de auto-unión? – fatuhoku

1

Utilice la instrucción sub-consulta y añadir índices a esas columnas.

2
UPDATE queued_items 
SET user_id = users.id, 
    item_id = items.id 
FROM queued_items as QI 
INNER JOIN users ON QI.user_id = users.imported_id 
INNER JOIN items ON QI.item_id = items.imported_id 
+0

Escribir un mensaje, no solo código, explicar por favor –

+0

La forma en que interpreto la documentación sobre esto: 'queued_items' inmediatamente después de que la ACTUALIZACIÓN en realidad se trata como un alias cuando también hay una cláusula FROM. Técnicamente, esta consulta debería funcionar como UPDATE QI ... FROM queued_items como QI ... Así que el error dice: "hey, ese alias ya está tomado implícitamente". Básicamente, si solo tenemos una cláusula Where, entonces no es necesario que califique por completo las referencias de campo con la tabla, pero tan pronto como presente una cláusula From, necesitamos introducir un alias para la tabla, de modo que el compilador no lo haga. no te confundas –

Cuestiones relacionadas