0

我得到了这个在 Oracle 中有效的声明:

update table a set
a.attribute = 
    (select 
        round(sum(r.attribute1),4)
     from table2 p, table3 r
     where 1 = 1
     and some joins
    )                 
where 1 = 1
and a.attribute3 > 10 
;

现在我想在 Exasol DB 中做同样的声明。但我收到错误 [代码:0,SQL 状态:0A000] 不支持功能:这种相关子选择(会话:1665921074538906818)

经过一番研究,我发现您需要使用以下语法编写查询:

UPDATE table a 
set a.attribute = r.attribute2
FROM table a, table2 p, table3 r
     where 1 = 1
     and some joins
     and a.attribute3 > 10; 

问题是我不能取 r.attribute2 的总和。所以我得到一组不稳定的行。有什么方法可以在 Exasol DB 中进行第一次查询?

谢谢你们的帮助!

4

1 回答 1

1

以下 SQL UPDATE 语句适用于表 1 和表 2 之间的 JOIN 是 1 对 1 的情况(或者如果目标表和 JOIN 的结果集之间存在 1 对 1 的关系)

在这种情况下,目标表 val 列被更新,否则返回错误

UPDATE table1 AS a
    SET a.val = table2.val
FROM table1, table2
WHERE table1.id = table2.id;

另一方面,如果连接导致单个 table1 行的多次返回,则会引发不稳定的错误。

如果您想对相乘行的列值求和,也许以下方法会有所帮助

首先在 table1 的基础上汇总 table2 的所有行并将此子选择用作新的临时表,然后在 UPDATE FROM 语句中使用它

UPDATE table1 AS a
    SET a.val = table2.val
FROM table1
INNER JOIN (
    select id, sum(val) val from table2 group by id
) table2
    ON table1.id = table2.id;

我尝试使用两个表解决问题在您的情况下,您可能会在 subselect 语句中使用 table2 和 table3

我希望这是您正在寻找的答案

于 2020-05-18T23:45:53.153 回答