Sql 无法使用select查询获取DATEADD函数中的天数
我有一个表,表1,格式如下: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
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
theno\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
theno\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缺少几个国家。因此,报告没有更新。但除此之外,您的查询工作得很好。谢谢你的帮助谢谢你的帮助。我同意戈登的解决方案。谢谢你的帮助。我同意戈登的解决方案。