我看了一遍,但是在匹配客户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匹配,我希望更新表列。我的目标是避免从子查询创建一个全新的表。任何帮助,将不胜感激。感谢。
答案 0 :(得分:3)
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 a.x, b.y from a join b on a.a = b.b) set x = y
。但这有点奇怪,需要独特的约束来工作。
或者你可以只用UPDATE部分来使用MERGE。将MERGE仅用于UPDATE是不常见的,但由于Oracle支持ANSI标准,因此它可以帮助您使用熟悉的语法。
答案 1 :(得分:2)
看起来你在这里打破了规范化(在数据库中多次重复相同的数据),这可能会导致很多问题,并试图保持这个列的正确更新。假设您理解并仍想继续,这应该有效:
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 Server运行它会有问题。