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

Sql 无法使用select查询获取DATEADD函数中的天数,sql,sql-server-2008,dateadd,Sql,Sql Server 2008,Dateadd,我有一个表,表1,格式如下: Country No_Of_Days XX 5 YY 10 我需要更新另一个表(表2)中的End_Date列,它有一个Start_Date,方法是将上述表中的天数添加到Start_Date: Country Start_Date End_Date Calc_Manual_Flag XX 25-Dec-16 30-Dec-16 CALC YY

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

Country    No_Of_Days
  XX          5
  YY          10
我需要更新另一个表(表2)中的End_Date列,它有一个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.

Msg 512,第16级,状态1,第1行
子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时。

请提供这方面的指导。

我将使用显式的
连接来执行此查询:

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;
如果确实要更新不匹配的行,可以使用
左联接

这修复了问题的近端原因,这是由于
表11中的多个匹配行造成的。更新使用了任意匹配项

要真正解决问题,您需要决定要做什么。如果要减去所有匹配的天数,请在加入之前进行聚合:

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;

我将使用显式的
连接执行此查询:

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;
如果确实要更新不匹配的行,可以使用
左联接

这修复了问题的近端原因,这是由于
表11中的多个匹配行造成的。更新使用了任意匹配项

要真正解决问题,您需要决定要做什么。如果要减去所有匹配的天数,请在加入之前进行聚合:

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
the
no\u of u 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 

错误消息清楚地表明,
Country
在第一个表中有重复的行,因此您需要根据某种顺序确定要对重复的行执行什么操作
sum
the
no\u of u 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行更新抱歉,这是我收到的消息消息512,级别16,状态1,第1行子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时。会发生什么?什么是“工作不正常”的意思?你有错误吗?意外值?我收到消息0行更新抱歉,这是我收到的消息消息512,级别16,状态1,第1行子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时。Hello Gordon。谢谢你的回答。即使在我发布的关于子查询的新错误消息被显示出来之后,这是否仍然有效?您好,Gordon,我测试了您的解决方案。它给了我很好的结果。但奇怪的是,它不会随机更新某些国家,即使开始日期不为空,并且国家在表1中。我的表格1缺少几个国家。因此,报告没有更新。但除此之外,您的查询工作得很好。谢谢你的帮助你好,戈登。谢谢你的回答。即使在我发布的关于子查询的新错误消息被显示出来之后,这是否仍然有效?您好,Gordon,我测试了您的解决方案。它给了我很好的结果。但奇怪的是,它不会随机更新某些国家,即使开始日期不为空,并且国家在表1中。我的表格1缺少几个国家。因此,报告没有更新。但除此之外,您的查询工作得很好。谢谢你的帮助谢谢你的帮助。我同意戈登的解决方案。谢谢你的帮助。我同意戈登的解决方案。