Невозможно использовать запрос выбора для получения количества дней в функции 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