Как я могу заставить этот сложный запрос на обновление работать? - PullRequest
0 голосов
/ 23 июня 2009
SELECT
    (SELECT 
        IIF(IsNull(sum(b.AmountCharged) - sum(b.AmountPaid)),
                a.Balance, 
                (sum(b.AmountCharged) - sum(b.AmountPaid)))
        FROM tblCurrentTransaction AS b
        WHERE b.TenantTransactionID <= a.TenantTransactionID 
                AND b.Tenant = a.Tenant
        GROUP BY b.Tenant
    ) AS TrueBalance, a.TenantTransactionID
    FROM tblCurrentTransaction AS a
    ORDER BY a.Tenant, a.TenantTransactionID;
UNION
UPDATE tblCurrentTransaction SET tblCurrentTransaction.Balance = TrueBalance
WHERE tblCurrentTransaction.TenantTransactionID = a.TenantTransactionID;

По сути, я получаю набор результатов из первого запроса, а затем сопоставляю его TenantTransactionID с запросом на обновление. Однако Access жалуется: «Запрос действия не может быть использован в качестве источника строки»

Как я могу это исправить?

Это запрос без СОЮЗА

UPDATE tblCurrentTransaction SET tblCurrentTransaction.Balance = (SELECT
    (SELECT 
        IIF(IsNull(sum(b.AmountCharged) - sum(b.AmountPaid)),
                a.Balance, 
                (sum(b.AmountCharged) - sum(b.AmountPaid)))
        FROM tblCurrentTransaction AS b
        WHERE b.TenantTransactionID <= a.TenantTransactionID 
                AND b.Tenant = a.Tenant
        GROUP BY b.Tenant
    ) AS TrueBalance
    FROM tblCurrentTransaction AS a
    WHERE a.TenantTransactionID = tblCurrentTransaction.TenantTransactionID
    ORDER BY a.Tenant, a.TenantTransactionID;
);

Но это ничего не делает, и Access жалуется "Операция должна использовать обновляемый запрос"

Это запрос, который собирает данные Этот запрос возвращает истинный баланс и идентификатор транзакции, к которой он принадлежит. Это то, что мне нужно вставить в таблицу.

SELECT (SELECT IIF(IsNull(sum(b.AmountCharged) - sum(b.AmountPaid)),a.Balance, (sum(b.AmountCharged) - sum(b.AmountPaid)))
          FROM tblCurrentTransaction AS b
          WHERE b.TenantTransactionID <= a.TenantTransactionID AND b.Tenant = a.Tenant
          GROUP BY b.Tenant
        ) AS TrueBalance, a.TenantTransactionID
FROM tblCurrentTransaction AS a
ORDER BY a.Tenant, a.TenantTransactionID;

Ответы [ 5 ]

2 голосов
/ 23 июня 2009

SELECT UNION UPDATE. Вот это да. Никогда не видел, чтобы кто-нибудь пробовал это раньше.

Если это действительно нужно сделать в SQL, я бы сказал, переписать все это как UPDATE с подзапросами.

Если в действительности это не нужно делать в SQL, я бы сказал, переписать весь процесс, чтобы логика была на языке вашего приложения, а запросы SQL были простыми UPDATE s.

Edit: OP и я пережили довольно много приключений, как вы можете видеть в комментариях. Окончательное решение состояло в том, чтобы использовать чистую таблицу для выполнения вычислений и перенести полученные результаты обратно в tblCurrentTransaction. Я обвиняю Access.

1 голос
/ 23 июня 2009

Попробуйте это:

UPDATE tblCurrentTransaction SET tblCurrentTransaction.Balance = i.TrueBalance
FROM ((SELECT 
    IIF(IsNull(sum(b.AmountCharged) - sum(b.AmountPaid)), a.Balance, (sum(b.AmountCharged) - sum(b.AmountPaid)))
    FROM tblCurrentTransaction AS b
    WHERE b.TenantTransactionID <= a.TenantTransactionID AND b.Tenant = a.Tenant
    GROUP BY b.Tenant
  ) AS TrueBalance, a.TenantTransactionID
  FROM tblCurrentTransaction AS a
 )AS i
WHERE tblCurrentTransaction.TenantTransactionID = i.TenantTransactionID;
0 голосов
/ 24 июня 2009

См. MSDN:

ACC: обновление запроса на основе общих сбоев запроса

[Цитировать] Когда вы запускаете запрос на обновление, вы получаете следующее сообщение об ошибке:

Операция должна использовать обновляемый запрос.

Это сообщение об ошибке появляется, когда значения в строке «Обновить до» запроса являются полями в ... запросе выбора или подзапросе, который содержит агрегатные (итоговые) функции ...

Такое поведение является конструктивным ограничением. [Unquote]

[Я слышал, что кто-то здесь отрицает голосование за отказ от ядра базы данных Access. Ну да ладно, думаю, мне просто нужно поставить под угрозу свою репутацию ...]

У механизма доступа к базе данных есть много «конструктивных ограничений», но для меня его нестандарт (то есть стандарт SQL ISO / ANSI), неоднозначный и строго ограниченный синтаксис UPDATE - его худшая функция. Ни один из обходных путей для меня неприемлем и является одной из подлинных причин, по которой я перенес все свои серьезные проекты на SQL Server несколько лет назад.

0 голосов
/ 23 июня 2009

У меня есть недавний опыт, подобный этому. Мне нужно было обновить объединение и обнаружил, что Access не будет обрабатывать сложные запросы на обновление. Я подозреваю, что эта ситуация попадает в эту корзину, но это действительно трудно установить, так как документы Access не так уж точны в том, что они будут и не будут делать. Я закончил переносом работы на SQL Server.

Итог, я согласен с CHAOS, что вы должны упростить запрос, окружив его логикой приложения.

0 голосов
/ 23 июня 2009

Вам необходимо изменить порядок запроса, чтобы выполнить ОБНОВЛЕНИЕ ... ГДЕ (критерии) В (ВЫБРАТЬ ...). В основном, используйте ваш SELECT в качестве подвыбора для предоставления набора результатов для IN.

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