繁体   English   中英

无法让“从子查询更新”语句在 Oracle SQL 中工作

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM