无法使用 select 查询获取 DATEADD 函数中的天数

Not able to use a select query to get number of days in DATEADD function

我有一个table,表1,格式如下:

Country    No_Of_Days
  XX          5
  YY          10

我需要更新另一个 table 表 2 中的 End_Date 列,它有一个 Start_Date 通过将上述 table 中的天数添加到 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.

请指导。

我会使用显式 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 在第一个 table 中有重复项,因此您需要弄清楚要对重复行执行的操作 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