2010-10-02 16 views

Respuesta

109

Como siempre y cuando tenga los índices adecuados en su lugar esto debería funcionar bien:

UPDATE table_a 
SET 
     column_a_1 = (SELECT table_b.column_b_1 
          FROM table_b 
          WHERE table_b.user_name = table_a.user_name) 
    , column_a_2 = (SELECT table_b.column_b_2 
          FROM table_b 
          WHERE table_b.user_name = table_a.user_name) 
WHERE 
    EXISTS (
     SELECT * 
     FROM table_b 
     WHERE table_b.user_name = table_a.user_name 
    ) 

ACTUALIZACIÓN en sqlite3 no admite una cláusula FROM, lo que hace de este un poco más de trabajo que en otros RDBMS.

Si el rendimiento no es satisfactorio, otra opción podría ser crear nuevas filas para table_a usando un seleccionar y unir con table_a en una tabla temporal. A continuación, elimine los datos de table_a y vuelva a llenar el temporal.

+4

tuviera que excluir la parte de la TABLE_A ha dejado lado nd del argumento set, para hacer que esto funcione. Con la respuesta anterior, se ve como 'column_a_1 = (SELECT table_b.column_b_1 FROM table_b WHERE table_b.nombre_usuario = table_a.nombre_usuario)' –

+0

Esta respuesta ayuda a comprender con más detalle cómo copiar para la respuesta publicada en http://stackoverflow.com/questions/17267417/how-to-upsert-merge-insert-on-duplicate-update-in-postgresql/17267423 # 17267423 – zerocog

+0

¿Cuántas veces se realiza la unión aquí? solo 3 veces, o en su lugar 3 veces por fila en la tabla_a? (mi SQL está oxidado) –

2

Hay una solución aún mucho mejor para actualizar una tabla de otra tabla:

;WITH a AS 
(
    SELECT 
     song_id, 
     artist_id 
    FROM 
     online_performance 
) 
UPDATE record_performance 
SET 
    op_song_id=(SELECT song_id FROM a), 
    op_artist_id=(SELECT artist_id FROM a) 

; 
+1

Dado que lo anterior está buscando filas específicas (record_id = 2347), uno tendría que escribir el código de arriba 1000 veces para actualizar 1000 filas? –

+0

Esto parece prometedor, pero no funcionará cuando necesite unir ambas tablas en una columna común (como 'user_name' en la pregunta original). En su lugar, esto establecerá todos los valores correspondientes en la tabla que se actualiza a los de un solo registro en la tabla de origen. Intenté enumerar la columna común y agregar una condición 'WHERE', pero no funcionó. –

+0

** ACTUALIZACIÓN ** En realidad, mi intento fue correcto. Pude haber tenido una línea adicional en la consulta y decía * ningún error * por alguna razón, lo que me confundió. La solución fue, de hecho, agregar la columna requerida a la primera selección y luego hacer que todas las demás selecciones se refieran a ella, p. '(SELECCIONAR song_id FROM a WHERE guid = record_performance.guid)' –

1

A partir de la versión de SQLite 3.15 la sintaxis para UPDATE admite una columna de nombre de lista en la parte SET por lo que la consulta puede escribirse como

UPDATE table_a 
SET 
    (column_a_1, column_a_2) = (SELECT table_b.column_b_1, table_b.column_b_2 
           FROM table_b 
           WHERE table_b.user_name = table_a.user_name) 
WHERE 
    EXISTS (
     SELECT * 
     FROM table_b 
     WHERE table_b.user_name = table_a.user_name 
    ) 

que no sólo es más corto, pero también más rápido

Cuestiones relacionadas