这是我到目前为止的查询,我理解为什么它不起作用......只是很难形成解决方案。
echo $new_image_name;
内部查询返回多行。我相信我需要按类型查询进行分区,但有点不确定。
基本上,我需要更新wrkque表,以便所有行实例都是" TRN" (转移)更新以反映" locacc"来自locmst表的(位置访问)。
将两个表行相互链接的关键是locmst.stoloc和wrkque.srcloc。
非常感谢任何帮助。
答案 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
。您需要为set
和where
:
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;