ОБНОВЛЕНИЕ с подзапросами (ГДЕ / ОТ) - PullRequest
0 голосов
/ 14 января 2019

Я пытаюсь обновить поле Да / Нет (Запечатано) в таблице под названием [Активы] из подзапроса.

Результаты подзапроса содержат идентификатор из [Активы] и желаемый результат поля, которое будет обновлено.

Я пробовал несколько вариантов, в том числе предложения WHERE или FROM, но не смог достичь подходящего результата.

Ниже приведен базовый оператор обновления и подзапрос. Любой совет с благодарностью.

UPDATE [Assets] SET Sealed = IsSealed

SELECT y.Asset AS Asset, 
       IIF(y.TotalSeals>0,Yes,No) AS IsSealed
FROM (
SELECT x.Asset, 
       SUM(IIF(x.BOMTypes="Seal",1,0)) AS BOMSeals, 
       SUM(IIF(x.MatMovTypes="Seal",1,0)) AS MMSeals, 
       SUM(IIF(x.POTypes="Seal",1,0)) AS POSeals, 
       (BOMSeals + MMSeals + POSeals) AS TotalSeals 
FROM (
SELECT [Data - Assets].ID AS Asset, 
       [Data - Inventory].Type AS BOMTypes, 
       NULL AS MatMovTypes, NULL AS POTypes, NULL AS TotalSeals 
FROM [Data - Inventory] INNER JOIN ([Data - Assets] INNER JOIN [Data - BOM] 
ON [Data - Assets].ID = [Data - BOM].Asset) 
ON [Data - Inventory].ID = [Data - BOM].Component 

UNION ALL 
SELECT [Data - Assets].ID AS Asset, NULL AS BOMTypes, 
       [Data - Inventory].Type AS MatMovTypes, 
       NULL AS POTypes, NULL AS TotalSeals 
FROM ([Data - Assets] INNER JOIN [Data - WO] 
ON [Data - Assets].ID = [Data - WO].Asset) 
INNER JOIN ([Data - Inventory] INNER JOIN [Data - MatMov] 
ON [Data - Inventory].ID = [Data - MatMov].Component) 
ON [Data - WO].ID = [Data - MatMov].WorkOrder 

UNION ALL 
SELECT [Data - Assets].ID AS Asset, 
       NULL AS BOMTypes, NULL AS MatMovTypes, 
       [Data - Inventory].Type  AS POTypes, NULL AS TotalSeals 
FROM ([Data - Assets] INNER JOIN [Data - WO] 
ON [Data - Assets].ID = [Data - WO].Asset) 
INNER JOIN ([Data - Inventory] INNER JOIN [Data - PO] 
ON [Data - Inventory].ID = [Data - PO].Component) 
ON [Data - WO].ID = [Data - PO].WorkOrder  
)  AS x 
GROUP BY x.Asset
)  AS y;

1 Ответ

0 голосов
/ 14 января 2019

Если ваша таблица Assets содержит поле Asset, соответствующее столбцу y.Asset в вашем подзапросе, то я бы предложил следующее:

update assets a inner join
(
    select y.asset, iif(y.totalseals > 0, Yes, No) as issealed
    from 
    (
       ***TLDR
    ) y
) t on a.asset = t.asset 
set a.sealed = t.issealed

Предполагается, что ваш подзапрос не содержит какой-либо формы агрегирования, иначе запрос не будет обновляемым.

Если ваш подзапрос включает агрегирование, вы можете использовать функцию агрегирования домена, например DCount или DSum (в зависимости от операций, выполняемых вашим подзапросом).

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