Не удается получить оператор "update from subquery" для работы в Oracle SQL - PullRequest
2 голосов
/ 27 апреля 2011

Я просмотрел все, но не могу понять, как обновить столбец в таблице на основе данных подзапроса при сопоставлении с идентификатором клиента. Вот некоторый синтаксис, чтобы дать представление о том, что я пытаюсь сделать:

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

По сути, я хочу обновить столбец таблицы, если другой столбец идентификатора в этой же таблице совпадает с идентификатором из подзапроса. Моя цель - избежать создания новой таблицы из подзапроса. Любая помощь будет оценена. Спасибо.

Ответы [ 2 ]

3 голосов
/ 28 апреля 2011

Oracle не поддерживает предложение 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.Но это довольно странно и требует уникальных ограничений для работы.

Или вы можете использовать MERGE только с разделом ОБНОВЛЕНИЕ.Необычно использовать MERGE только для ОБНОВЛЕНИЯ, но поскольку Oracle поддерживает стандарт ANSI, это может помочь вам использовать знакомый синтаксис.

2 голосов
/ 27 апреля 2011

Похоже, что вы нарушаете нормализацию (повторение одних и тех же данных в вашей базе данных более одного раза), что, вероятно, вызовет МНОГИЕ проблемы в будущем при попытке должным образом обновить этот столбец. Предполагая, что вы понимаете это и все еще хотите продолжить, это должно работать:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...