以下更新查询中出了什么问题。错误消息是
“ SD”附近的语法不正确。
代码:
UPDATE T_EmpSelf_Details SD, T_TravelDetails TD
SET SD.Host_Country = TD.New_Host_Country
WHERE
SD.EL_Year = TD.EL_Year
AND SD.Emp_ID = TD.EmpId
AND SD.Staff_number IN ('00002080', '00002320');
答案 0 :(得分:1)
没有理由使事情变得过于复杂...不需要CTE,派生表或子查询...
UPDATE SD SET
SD.Host_Country = TD.New_Host_Country
FROM
T_EmpSelf_Details SD
JOIN T_TravelDetails TD
ON SD.EL_Year = TD.EL_Year
AND SD.Emp_ID = TD.EmpId
WHERE
SD.Staff_number IN ('00002080', '00002320');
此语法还有一个额外的好处,即允许您将查询写为SELECT,验证谓词正确,然后轻松将其转换为UPDATE ...
/* begin by writing it as a SELECT... */
SELECT
SD.Host_Country,
TD.New_Host_Country
FROM
T_EmpSelf_Details SD
JOIN T_TravelDetails TD
ON SD.EL_Year = TD.EL_Year
AND SD.Emp_ID = TD.EmpId
WHERE
SD.Staff_number IN ('00002080', '00002320');
/* when you're satisfied that the correct rows & values are in scope. convet it to an UPDATE...
-- begin by writing it as a SELECT... */
--SELECT
-- SD.Host_Country,
-- TD.New_Host_Country
UPDATE SD SET
SD.Host_Country = TD.New_Host_Country
FROM
T_EmpSelf_Details SD
JOIN T_TravelDetails TD
ON SD.EL_Year = TD.EL_Year
AND SD.Emp_ID = TD.EmpId
WHERE
SD.Staff_number IN ('00002080', '00002320');
答案 1 :(得分:0)
尝试使用通用表表达式代替:
WITH cte
AS (
SELECT
SD.Host_Country
, TD.New_Host_Country
FROM T_EmpSelf_Details SD
INNER JOIN T_TravelDetails TD ON SD.EL_Year = TD.EL_Year
AND SD.Emp_ID = TD.EmpId
WHERE SD.Staff_number IN ('00002080', '00002320')
)
UPDATE cte
SET Host_Country = New_Host_Country
;
请注意,在25年前,ANSI标准对联接语法进行了形式化。尝试采用这种语法,首先要避免在from子句中的表名之间使用逗号。
更新语句的另一种方法如下:
UPDATE SD
SET SD.Host_Country = TD.New_Host_Country
FROM T_EmpSelf_Details SD
INNER JOIN T_TravelDetails TD
ON SD.EL_Year = TD.EL_Year
AND SD.Emp_ID = TD.EmpId
WHERE SD.Staff_number IN ('00002080', '00002320');
答案 2 :(得分:0)
在SQL中,使用“更新查询”一次只能更新一个表,因此在UPDATE
和SET
关键字之间只能指定一个表名。
但是在代码中,您指定了2个表(即使仅更新一个表)。
如此恢复状态,可以使用像这样的简单内部联接来实现
UPDATE SD -- Name/Alias of the Table to be updated
SET
Host_Country=TD.New_Host_Country
FROM T_EmpSelf_Details SD
INNER JOIN T_TravelDetails TD
ON SD.EL_Year=TD.EL_Year
WHERE SD.Emp_ID=TD.EmpId
AND SD.Staff_number in ('00002080','00002320');
答案 3 :(得分:-1)
@Alex Kudryashev正确指出了该错误,该错误试图一次更新2个表。更正的SQL:
UPDATE
T_EmpSelf_Details SD
INNER JOIN T_TravelDetails TD ON (
SD.EL_Year = TD.EL_Year
and SD.Emp_ID = TD.EmpId
)
SET
SD.Host_Country = TD.New_Host_Country
where
SD.Staff_number IN ('00002080', '00002320');