【问题标题】:SQL Update multiple rows and columns with subselect querySQL 使用子选择查询更新多行和多列
【发布时间】:2017-02-14 11:03:05
【问题描述】:

我需要从子选择查询中更新多行 (7) 中的多列 (2)。

这是我目前所拥有的:

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

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

(UPDATE语句的SET子句中嵌入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;

不工作但抛出异常。

感谢您的帮助。

流浪汉

【问题讨论】:

  • 错误信息非常清楚 - 您一次更新一行,因此子选择必须根据您提供的条件返回单行。找到一种方法来唯一标识commandtbl3中的行
  • commandtb2 和 commandtbl3 有多少行?您似乎只有几个,所以您可以将这些行编辑到您的问题中以便我们查看它们的值吗?

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


【解决方案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

【讨论】:

  • t2.attr 在此上下文中无效。 SQLCODE=-206, SQLSTATE=42703
  • 您确定您使用的是 DB2 吗?
  • DB2 v10.5 Windows。
  • 在 v10 的第二个版本中,我得到 SQLCODE=-811,SQLSTATE=21000。我从第一个查询中得到的相同错误
  • @Thevagabond 。 . .您需要选择所需的行。尝试添加 FETCH FIRST ONE ROW ONLY 。 . .这也应该适用于您的第一个版本。
【解决方案2】:

使用连接:

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

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

【讨论】:

  • 我得到 SQLCODE=-104, SQLSTATE=42601 它告诉我在 JOIN 之前缺少 FROM
猜你喜欢
  • 2012-06-30
  • 1970-01-01
  • 2012-01-01
  • 2011-08-24
  • 1970-01-01
  • 2021-07-23
  • 1970-01-01
  • 2013-05-24
  • 2015-08-07
相关资源
最近更新 更多