根据其他表列值更新多行

时间:2016-06-07 18:44:36

标签: sql oracle

这是我到目前为止的查询,我理解为什么它不起作用......只是很难形成解决方案。

echo $new_image_name;

内部查询返回多行。我相信我需要按类型查询进行分区,但有点不确定。

基本上,我需要更新wrkque表,以便所有行实例都是" TRN" (转移)更新以反映" locacc"来自locmst表的(位置访问)。

将两个表行相互链接的关键是locmst.stoloc和wrkque.srcloc。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

试试这个:

UPDATE wrkque
SET    locacc = (SELECT locmst.locacc
                 FROM   locmst
                 WHERE  locmst.stoloc = wrkque.srcloc)
WHERE  wrkque.oprcod = 'TRN'

内部查询需要引用外部查询,我们在此处执行:WHERE locmst.stoloc = wrkque.srcloc。我们不需要内部查询中的连接,我们只需要引用。

编辑EXISTS:

正如Gordon在他的回答中指出的那样,你应该在外部查询中包含一个EXISTS关联子句:

UPDATE wrkque
SET    locacc = (SELECT locmst.locacc
                 FROM   locmst
                 WHERE  locmst.stoloc = wrkque.srcloc)
WHERE  wrkque.oprcod = 'TRN'
AND EXISTS (SELECT locmst.stoloc
            FROM   locmst
            WHERE  locmst.stoloc = wrkque.srcloc)

如果不这样,任何不符合locmst.stoloc = wrkque.srcloc(存在于wrkque但不存在于locmst中)的行都会将locacc设置为null。如果两个表中都存在每一行,则可以将其保留,但最好始终包含它。

答案 1 :(得分:2)

这些类型的更新很棘手。您的基本问题是,当您应该使用关联子句时,子查询中有join。您需要为setwhere

执行此操作
UPDATE wrkque
    SET locacc = (SELECT locmst.locacc
                  FROM locmst
                  WHERE locmst.stoloc = wrkque.srcloc
                 )
    WHERE wrkque.oprcod = 'TRN' AND
          EXISTS (SELECT locmst.stoloc
                  FROM locmst
                  WHERE locmst.stoloc = wrkque.srcloc 
                 );

话虽如此,为什么要在locacc表中存储wrkque?您始终可以使用join获取适当的值。这样做的理由很充分,例如您可能正在初始化值然后被覆盖。但是,在大多数情况下,不需要在两个地方存储相同的信息。

答案 2 :(得分:0)

试试这个

UPDATE (SELECT locmst.locacc newOne, wrkque.locacc oldOne
            FROM locmst, wrkque
           WHERE locmst.stoloc = wrkque.srcloc
             AND wrkque.oprcod = 'TRN') t 
SET t.oldOne = t.newOne;