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

#sql #sql-server #tsql

#sql #sql-сервер #tsql

Вопрос:

Я столкнулся с проблемой. У меня есть две таблицы FreshStock и PurchaseInvoiceDetails .

Когда получен новый продукт, он попадает в PurchaseInvoiceDetails , и я хочу, чтобы он также попал во вторую таблицу.

У меня есть код, который сначала проверяет, не добавлен ли продукт в FreshStock , затем он сначала добавляет его, но если он уже добавлен, он обновляет его по ProductName . Я получаю сообщение об ошибке при его обновлении:

Сообщение 512, уровень 16, состояние 1,
подзапрос строки 13 вернул более 1 значения. Это не допускается, когда следует подзапрос =, !=, <, <= , >, >= или когда подзапрос используется как выражение. Действие заявления было прекращено.

Мой код:

 IF NOT EXISTS(SELECT * FROM [dbo].[FreshStock] WHERE [ProductName] = 'Makki Rusk')
BEGIN
    INSERT INTO [dbo].[FreshStock] ([ProductCode], [ProductName], [Stock],[IsAvailable])
        SELECT [ProductCode], [ProductName], SUM([Box]), 1
        FROM [dbo].[PurchaseInvoiceDetails]
        WHERE ProductName = 'Makki Rusk'
        GROUP BY [ProductCode],[ProductName]

    RETURN
END

IF  EXISTS(SELECT * FROM [dbo].[FreshStock] WHERE [ProductName] = 'Makki Rusk')
BEGIN
    UPDATE [dbo].[FreshStock]
    SET [ProductCode] = (SELECT [ProductCode] 
                         FROM [dbo].[PurchaseInvoiceDetails] 
                         WHERE [ProductName] = 'Makki Rusk'),
        [ProductName] = (SELECT [ProductName] 
                         FROM [dbo].[PurchaseInvoiceDetails] 
                         WHERE [ProductName] = 'Makki Rusk'),
        [Stock] = (SELECT SUM([Box])  
                   FROM [dbo].[PurchaseInvoiceDetails] 
                   WHERE [ProductName] = 'Makki Rusk')
     WHERE ProductName = 'Makki Rusk'
END
 

Комментарии:

1. Таблица DLL, образцы данных и т.д. было бы неплохо.

Ответ №1:

Ошибка, которую вы получаете, указывает на то, что один из следующих подзапросов возвращает несколько строк и его необходимо изменить, чтобы возвращать только одну строку:

 [ProductName] = SELECT [ProductCode] FROM [dbo].[PurchaseInvoiceDetails] WHERE [ProductName] = 'Makki Rusk'
[ProductName] = (SELECT [ProductName] FROM [dbo].[PurchaseInvoiceDetails] WHERE [ProductName] = 'Makki Rusk')
 

Ответ №2:

Вероятно, вам не нужно заново устанавливать код и имя, поэтому просто установите один столбец:

 UPDATE [dbo].[FreshStock]
SET [Stock] = (SELECT SUM([Box])
               FROM [dbo].[PurchaseInvoiceDetails]
               WHERE [ProductName] = 'Makki Rusk'
              )
WHERE  ProductName = 'Makki Rusk';
 

Комментарии:

1. @Gordon Linoff Спасибо