2009-04-01 15 views
79

espero que tenía sentido, quiero extenderme:SQL UPDATE SET una columna para que sea igual a un valor en una tabla relacionada a la que hace referencia una columna diferente?

Hay una tabla de datos de seguimiento para un concurso de televisión donde cada fila tiene ..

IdPregunta y AnswerID (hay una mesa para cada uno). Entonces, debido a un error, había un conjunto de QuestionIDs establecido en NULL, pero el QuestionID de un AnswerID relacionado está en la tabla de respuestas.

Entonces, decir QuestionID es NULL y AnswerID es 500, si vamos a la tabla de respuestas y encontramos AnswerID 500, hay una columna con el QuestionID que debería haber estado donde está el valor NULL.

Así que, básicamente, quiero configurar cada QuestionID NULL para que sea igual al QuestionID encontrado en la tabla de respuestas en la fila Answer del AnswerID que está en la tabla de seguimiento (misma fila que el NULL QuestionID que se está escribiendo).

¿Cómo podría hacer esto?

UPDATE QuestionTrackings 
SET QuestionID = (need some select query that will get the QuestionID from the AnswerID in this row) 
WHERE QuestionID is NULL AND ... ? 

No estoy seguro de cómo voy a ser capaz de hacer que le haga el IdPregunta a la IdPregunta del AnswerID juego ...

+0

MySQL y Microsoft SQL Server cada extensiones de apoyo a la sintaxis SQL para apoyar ACTUALIZACIÓN multi-mesa. Otras marcas no. No ha dicho qué marca de base de datos está usando. –

Respuesta

123
update q 
set q.QuestionID = a.QuestionID 
from QuestionTrackings q 
inner join QuestionAnswers a 
on q.AnswerID = a.AnswerID 
where q.QuestionID is null -- and other conditions you might want 

recomiendo para comprobar lo que el resultado es configurado para actualizar antes de ejecutar la actualización (misma consulta, sólo con un selecto):

select * 
from QuestionTrackings q 
inner join QuestionAnswers a 
on q.AnswerID = a.AnswerID 
where q.QuestionID is null -- and other conditions you might want 

Particularmente si cada ID respuesta tiene definitivamente sólo el 1 Identificación pregunta asociada.

+6

creo que esto no está trabajando en Oracle :( –

+5

No estoy seguro de por qué, pero esto no funciona para mí, sin embargo esto hace: 'QuestionTrackings actualización q combinación interna QuestionAnswers un en q.AnswerID = a.AnswerID conjunto q.QuestionID = a.QuestionID; ' parece ser la misma consulta básica en un orden diferente. Alguna idea ¿por qué? – billynoah

+2

@billynoah, ORA-00971: palabra clave SET faltante en Oracle – masT

11
UPDATE 
    "QuestionTrackings" 
SET 
    "QuestionID" = (SELECT "QuestionID" FROM "Answers" WHERE "AnswerID"="QuestionTrackings"."AnswerID") 
WHERE 
    "QuestionID" is NULL 
AND ... 
+1

Trabajé en Oracle para mí. La respuesta de @eglasius no. – Lombas

22

Sin la notación update-and-join (no todos los DBMS soportan eso), utilice:

UPDATE QuestionTrackings 
    SET QuestionID = (SELECT QuestionID 
         FROM AnswerTrackings 
         WHERE AnswerTrackings.AnswerID = QuestionTrackings.AnswerID) 
    WHERE QuestionID IS NULL 
    AND EXISTS(SELECT QuestionID 
         FROM AnswerTrackings 
         WHERE AnswerTrackings.AnswerID = QuestionTrackings.AnswerID) 

A menudo, en una consulta de este tipo, que necesita para calificar la cláusula WHERE con una cláusula EXISTS que contiene la subconsulta. Esto evita que la ACTUALIZACIÓN pisotee las filas donde no hay coincidencia (generalmente anulando todos los valores). En este caso, dado que una ID de pregunta faltante cambiaría el NULL a NULL, podría decirse que no importa.

7

Estaba teniendo la misma pregunta. Aquí hay una solución de trabajo que es similar a la de eglasius. Estoy usando postgresql.

UPDATE QuestionTrackings 
SET QuestionID = a.QuestionID 
FROM QuestionTrackings q, QuestionAnswers a 
WHERE q.QuestionID IS NULL 

se queja si se utilizó q en lugar del nombre de la tabla en la línea 1, y nada debe preceder a IdPregunta en la línea 2.

3
select p.post_title,m.meta_value sale_price ,n.meta_value regular_price 
    from wp_postmeta m 
    inner join wp_postmeta n 
     on m.post_id = n.post_id 
    inner join wp_posts p 
     ON m.post_id=p.id 
    and m.meta_key = '_sale_price' 
    and n.meta_key = '_regular_price' 
    AND p.post_type = 'product'; 



update wp_postmeta m 
inner join wp_postmeta n 
    on m.post_id = n.post_id 
inner join wp_posts p 
    ON m.post_id=p.id 
and m.meta_key = '_sale_price' 
and n.meta_key = '_regular_price' 
AND p.post_type = 'product' 
set m.meta_value = n.meta_value; 
9

no sé si le han acabado en el El mismo problema que yo en MySQL Workbench pero ejecutando la consulta con el INNER JOIN después de la declaración FROM no funcionó para mí. No pude ejecutar la consulta porque el programa se quejó de la declaración FROM.

Así que con el fin de hacer el trabajo de consulta que lo cambié a

UPDATE table1 INNER JOIN table2 on table1.column1 = table2.column1 
SET table1.column2 = table2.column4 
WHERE table1.column3 = 'randomCondition'; 

en lugar de

UPDATE a 
FROM table1 a INNER JOIN table2 b on a.column1 = b.column1 
SET a.column2 = b.column4 
WHERE a.column3 = 'randomCondition'; 

supongo que mi solución es la sintaxis correcta para MySQL.

+0

Esto funcionó para mí también en MySQL – nads

1

Actualizar los datos de la tabla en segundo primera mesa necesitan combinación interna antes SET:

`UPDATE `table1` INNER JOIN `table2` ON `table2`.`id`=`table1`.`id` SET `table1`.`name`=`table2`.`name`, `table1`.`template`=`table2`.`template`; 
Cuestiones relacionadas