2016-01-12 6 views
0

У меня есть таблица, Table1, в следующем формате:не в состоянии использовать запрос на выборку, чтобы получить количество дней в функции DATEADD

Country No_Of_Days 
    XX   5 
    YY   10 

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

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. 

Просьба предоставить руководство по этому вопросу.

+0

Что происходит? –

+0

Что означает «не работает»? Вы получаете ошибки? Неожиданные значения? –

+0

Я получаю сообщение 0 строк обновлено – Manus

ответ

1

Я хотел бы сделать этот запрос, используя явное 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; 
+0

Привет, Гордон. Спасибо за ответ. Будет ли это работать даже после появления нового сообщения об ошибке в отношении подзапроса? – Manus

+0

Привет, Гордон, я протестировал ваше решение. Это дает мне хорошие результаты. Но одна странная вещь: она не обновляет определенные страны случайным образом, хотя Start_Date не является нулевым, а страна находится в таблице 1 – Manus

+0

Извинения Гордона. В моей таблице 1 отсутствовало несколько стран. Следовательно, нет обновления. Но в противном случае ваш запрос работает красиво. Спасибо за помощь – Manus

1

Сообщение об ошибке ясно говорит, что Country Повторяющиеся в первой таблице, так что вы должны понять, что вы хотите сделать с повторяющимися рядами либо sumno_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 
+0

Спасибо за помощь VR46. Я пошел с решением Гордона. – Manus