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

У меня есть таблица, Table1, в следующем формате:

Country    No_Of_Days
  XX          5
  YY          10

И мне нужно обновить столбец End_Date в другой таблице, Table2, которая имеет Start_Date, добавив дни в вышеупомянутой таблице в Start_date:

Country     Start_Date      End_Date    Calc_Manual_Flag
  XX        25-Dec-16       30-Dec-16        CALC
  YY        02-Jan-17       12-Jan-17        CALC  

Я использовал следующий запрос, но он не работает:

UPDATE dbo.Table2
SET End_date = 
dateadd(
        day,
        (SELECT No_Of_Days FROM Table1 WHERE Table2.Country = Table1.Country),Start_Date),
    Calc_Manual_Flag = 'CALC'
WHERE Table2.End_Date IS NULL
AND Table2.Start_Date IS NOT NULL

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

Msg 512, Level 16, State 1, Line 1
Subquery returned more than 1 value. This is not permitted when the subquery     follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

Пожалуйста, предоставьте руководство по этому вопросу.

2 ответа

Решение

Я бы сделал этот запрос, используя явный JOIN:

UPDATE t2
    SET End_date = DATEADD(day, t1.No_Of_Days, t2.Start_Date)
        Calc_Manual_Flag = 'CALC'
    FROM dbo.Table2 t2 JOIN
         Table1 t1
         ON t2.Country = t1.Country
    WHERE t2.End_Date IS NULL AND t2.Start_Date IS NOT NULL;

Вы можете использовать LEFT JOIN если вы действительно хотите обновить строки, где нет совпадения.

Это устраняет ближайшую причину проблемы, которая связана с несколькими совпадающими строками в Table11, Произвольное совпадение используется для обновления.

Чтобы действительно решить проблему, нужно решить, что делать. Если вы хотите вычесть все подходящие дни, то перед объединением выполните агрегирование:

UPDATE t2
    SET End_date = DATEADD(day, t1.No_Of_Days, t2.Start_Date)
        Calc_Manual_Flag = 'CALC'
    FROM dbo.Table2 t2 JOIN
         (SELECT Country, SUM(No_Of_Days) as No_Of_Days
          FROM Table1 t1
          GROUP BY Country
         ) t1
         ON t2.Country = t1.Country
    WHERE t2.End_Date IS NULL AND t2.Start_Date IS NOT NULL;

Сообщение об ошибке ясно говорит о том, что Country дубликаты в первой таблице, поэтому вам нужно выяснить, что вы хотите сделать с дублирующимися строками sum no_of_days или взять no_of_days основанный на некотором заказе

UPDATE t2 
SET    End_date = Dateadd(day, t1.no_of_days, t2.start_date), 
       Calc_Manual_Flag = 'CALC' 
FROM   dbo.table2 t2 
       CROSS apply (SELECT TOP 1 no_of_days --sum(no_of_days)
                    FROM   table1 t1 
                    WHERE  t2.country = t1.country 
                    ORDER  BY somecol) cs 
WHERE  t2.end_date IS NULL 
       AND t2.start_date IS NOT NULL 
Другие вопросы по тегам