[英]Oracle-SQL Correlated Subquery in UPDATE-Statement doesn't work
[英]Can't get “update from subquery” statement to work in Oracle SQL
我已经查看了所有内容,但无法弄清楚在匹配客户 ID 时如何根据子查询数据更新表中的列。 这里有一些语法可以让我了解我正在尝试做的事情:
UPDATE TableName
SET TableName.Revenue = Z.Revenue
FROM
(
SELECT
CustomerID,
sum(Revenue) as Revenue
FROM
(
SELECT
CustomerID,
Revenue
FROM
TableA
WHERE
CustomerID in TableF
UNION ALL
SELECT
CustomerID,
Revenue
FROM
TableB
WHERE
CustomerID in TableF
)
GROUP BY
CustomerID
) Z
WHERE
TableName.CustomerID = Z.CustomerID
本质上,如果同一表下的另一个 ID 列与子查询中的 ID 匹配,我希望更新表列。 我的目标是避免从子查询创建一个全新的表。 任何帮助,将不胜感激。 谢谢。
Oracle 不支持 UPDATE 的 FROM 子句。 这将起作用:
UPDATE TableName
SET TableName.Revenue =
(
SELECT
sum(Revenue) as Revenue
FROM
(
SELECT
CustomerID,
Revenue
FROM
TableA
WHERE
CustomerID in (select CustomerID from TableF)
UNION ALL
SELECT
CustomerID,
Revenue
FROM
TableB
WHERE
CustomerID in (select CustomerID from TableF)
)
WHERE
CustomerID = TableName.CustomerID
GROUP BY
CustomerID
);
另一种选择是使用 dml_expression_table 语法,它基本上看起来像update (select ax, by from a join b on aa = bb) set x = y
。 但这有点奇怪,需要独特的约束才能工作。
或者您可以只使用 MERGE 和 UPDATE 部分。 仅将 MERGE 用于 UPDATE 是不常见的,但由于 Oracle 支持 ANSI 标准,它可以帮助您使用熟悉的语法。
看起来您在这里打破了规范化(在数据库中多次重复相同的数据),这可能会在尝试保持此列正确更新时导致很多问题。 假设您了解这一点并仍想继续,这应该有效:
UPDATE
Table_Name
SET
revenue = SUM(Z.revenue)
FROM
Table_Name
INNER JOIN
(
SELECT
customer_id,
SUM(revenue) AS revenue
FROM
(
SELECT
customer_id,
revenue
FROM
Table_A
WHERE
customer_id IN (SELECT customer_id FROM Table_F)
UNION ALL
SELECT
customer_id,
revenue
FROM
Table_B
WHERE
customer_id IN (SELECT customer_id FROM Table_F)
)
) Z ON
Z.customer_id = Table_Name.customer_id
我认为问题可能是您的 FROM 子句中没有主表或专门加入查询。 我没有做很多 Oracle 工作,所以我不肯定,但如果你用 MS SQL 服务器运行它,那将是一个问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.