SQL使用subselect查询更新多个行和列

时间:2017-02-14 11:03:06

标签: sql db2 sql-update subquery db2-luw

我遇到的问题是需要从子选择查询中更新多行(7)中的多个列(2)。

这是我到目前为止所做的:

UPDATE commandtbl2 t1 
SET (attr, attr2) = (
SELECT attr, attr2 
FROM  commandtbl3 t2 
WHERE t1.cmd=t2.cmd
);

然而,当我让它运行时,我得到SQLCODE = -811,SQLSTATE = 21000

(嵌入式选择陈述的结果或更新声明的集合条款中的一个副本是多于一行的表,或者基本预测的子语的结果超过一个值)

我的错误在哪里?它应该更改3行中的2列,并保留其他行。我只能使用SQL,所以没有Java,PHP等。

由于这是DB2解决方案,我在网上找到了:

UPDATE commandtbl2 t1
SET attr = t2.attr, attr2=t2.attr2
FROM commandtbl2 t1
JOIN commandtbl3 t2
ON t1.cmd = t2.cmd ;

或者

UPDATE
commandtbl2 t1
JOIN
commandtbl3 t2 ON t1.cmd=t2.cmd 
SET
t1.attr = t2.attr,
t1.attr2=t2.attr2;

不能工作,但会抛出异常。

感谢您的帮助。

TheVagabond

2 个答案:

答案 0 :(得分:-1)

使用联接:

UPDATE commandtbl2 t1 JOIN commandtbl3 t2 ON t1.cmd=t2.cmd SET t1.attr=t2.attr, t1.attr2=t2.attr2;

问题可能如上所述,您尝试使用更多行的值更新一行(或多行)。

答案 1 :(得分:-1)

我认为您的第一个版本应该可行。但这是另一个想法:

UPDATE commandtbl2
    SET attr = t2.attr, attr2 = t2.attr2
    FROM commandtbl3 t2
    WHERE commandtbl2.cmd = t2.cmd ;

DB2的版本很重要。在V10中,您可能需要两个子查询:

UPDATE commandtbl2
    SET attr = (SELECT t2.attr FROM commandtbl3 t2 WHERE commandtbl2.cmd = t2.cmd FETCH FIRST 1 ROW ONLY),
        attr2 = (SELECT t2.attr2 FROM commandtbl3 t2 WHERE commandtbl2.cmd = t2.cmd FETCH FIRST 1 ROW ONLY);

注意:通常在使用FETCH FIRST 1 ROW ONLY时,您会有ORDER BY