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

时间:2011-04-27 15:18:31

标签: sql plsql subquery sql-update

我看了一遍,但是在匹配客户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匹配,我希望更新表列。我的目标是避免从子查询创建一个全新的表。任何帮助,将不胜感激。感谢。

2 个答案:

答案 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运行它会有问题。