2017-02-14 108 views
0

我有需要从子查询查询更新多行(7)多行(7)的问题。使用子查询查询更新多个行和列

这是我到目前为止有:

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

然而,当我让那跑,我得到SQLCODE = -811,SQLSTATE = 21000

(嵌入式SELECT语句或子选择的结果在更新声明的集合条款中是超过一行的表格,或者基本预测的子查询的结果是超过一个值)

我的错误在哪里?它应该改变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

+0

[SQL更新查询使用连接]的可能重复(http://stackoverflow.com/questions/982919/sql-update-query-using-joins) – HoneyBadger

+1

错误消息非常清晰 - 您更新第1行时间,所以在你提供的条件下,子查询必须返回一行。在'commandtbl3'中找到唯一标识行的方法 – mustaccio

+0

commandtb2和commandtbl3中有多少行?看起来你只有几个,所以你可以编辑你的问题的行,以便我们可以看到他们的价值观? – user2338816

回答

-1

使用JOIN:

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

问题很可能是因为说,你尝试用更多的行的值更新一行(或多个)。

+0

我得到SQLCODE = -104,SQLSTATE = 42601,它告诉我,FROM在JOIN – Thevagabond

-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

+0

t2.attr在此上下文中无效之前丢失。 SQLCODE = -206,SQLSTATE = 42703 – Thevagabond

+0

您确定您使用的是DB2吗? –

+0

DB2 v10.5 Windows。 – Thevagabond