У меня есть 3 таблицы, которые я получил с помощью запроса из моей базы данных.

OverallTable

| Invoice | Product | Total | Delivered | Not Delivered |
---------------------------------------------------------
|  00001  |  AAAA   |   4   |   null    |     null      |
|  00001  |  BBBB   |   2   |   null    |     null      |
|  00001  |  CCCC   |   2   |   null    |     null      |
|  00002  |  AAAA   |   3   |   null    |     null      |

* Общая таблица в начальном состоянии

DeliveredTable

| Invoice | Product | Delivered |
---------------------------------
|  00001  |  AAAA   |     2     |
|  00001  |  BBBB   |     2     |
|  00001  |  CCCC   |     0     |
|  00002  |  AAAA   |     3     |

NotDeliveredTable

| Invoice | Product | Not Delivered |
---------------------------------
|  00001  |  AAAA   |      2        |
|  00001  |  BBBB   |      0        |
|  00001  |  CCCC   |      2        |
|  00002  |  AAAA   |      0        |

Вопрос в том, как мне вставить доставленные и недоставленные данные в таблицу TotalTable?

Я пытаюсь обновить, используя следующий запрос, но я получаю ошибку

Подзапрос вернул более 1 значения

UPDATE @OverallTemp
SET delivered = 
(SELECT ddt.fqty FROM @DeliveredTemp ddt where ddt.PRODUCT= 
[@OverallTemp].product)
WHERE EXISTS 
(SELECT ddt.invoice FROM @DeliveredTemp ddt where ddt.invoice= 
[@OverallTemp].invoice);

UPDATE @OverallTemp
SET notdelivered = 
(SELECT sdt.qty FROM @NotDeliveredTemp sdt  where sdt.PRODUCT= 
[@OverallTemp].product)
WHERE EXISTS 
(SELECT sdt.invoice FROM @NotDeliveredTemp sdt where sdt.invoice= 
[@OverallTemp].invoice);
-1
Hasics 20 Авг 2018 в 12:35

3 ответа

Лучший ответ

Вы не должны использовать EXISTS, просто выполните JOIN с оператором UPDATE:

UPDATE ot
     set ot.Delivered = dt.Delivered 
FROM OverallTable ot INNER JOIN 
     DeliveredTable dt 
     ON dt.Invoice = ot.Invoice AND
        dt.Product = ot.Product; 
3
Yogesh Sharma 20 Авг 2018 в 09:42

Ошибка говорит вам о проблеме, ваш подзапрос возвратил более 1 строки.

Если вы хотите INSERT данных в таблицу, используя набор данных, то вы должны обрабатывать эти данные как набор данных, а не скалярное значение:

Например, для вашей первой попытки правильный запрос будет (обратите внимание, что это не используется):

UPDATE OT
SET delivered = ddt.fqty
FROM @OverallTemp OT
     JOIN  @DeliveredTemp ddt ON ddt.PRODUCT= OT.product;

Попробуйте второй запрос, и если у вас возникли проблемы, пожалуйста, оставьте комментарий.

1
Larnu 20 Авг 2018 в 09:50

Вы можете попытаться использовать UPDATE ...From ... JOIN вместо подзапроса обновления.

update t1
set Delivered = t2.Delivered 
from OverallTable t1
join DeliveredTable t2 on t2.Invoice = t1.Invoice 
and  t2.Product = t1.Product 

update t1
set [Not Delivered] = t2.[Not Delivered]
from  NotDeliveredTable t1
join NotDeliveredTable t2 on t2.Invoice  = t1.Invoice
 and  t2.Product = t1.Product 
0
D-Shih 20 Авг 2018 в 09:57
51927902