2016-06-07 42 views
0

以下是我到目前为止的查询,我明白为什么它不工作...只是很难形成解决方案。根据其他表列值更新多行

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

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

本质上,我需要更新wrkque表,以便更新所有属于“TRN”(转移)的行实例以反映locmst表中的“locacc”(位置访问)。

将两个表行连接到彼此的关键是locmst.stoloc和wrkque.srcloc。

任何帮助非常感谢。

回答

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相关条款以及:

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

啧,感谢阿龙。让我们只是说,我在想这个...大声笑 – user3642066

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

说了这么多,你为什么存储locaccwrkque表?您始终可以使用join获取适当的值。这样做有很好的理由,比如你可能正在初始化值,然后被覆盖。但是在大多数情况下,不需要在两个地方存储相同的信息。

+0

谢谢!这个也可以。 – user3642066

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;