首页 > 解决方案 > SQL Server:运行 INSERT INTO where exists and join 时出现语法错误

问题描述

如果这些行不在表中,我正在尝试将数据从一个表复制到另一个表中。此外,我想根据要复制的原始表中列的值添加第三个表中列的值。

我继承了两个表,其中一个将被冗余(因为数据库将失效),因此需要将信息移动到另一个设计不同的表(但是数据类型是)。

INSERT INTO [AMData].[dbo].[AttendanceRecord] A ([TypeID], [Date], [EmpID], [EhrID], [SickReason], [AbsID])
   SELECT 
       T.[ID], F.[EHrDate], F.[EHrEmpID], F.[EHrID], F.[EHRUserComment], F.[AbsID]
   FROM 
       [Focus].[dbo].[AllAbsence] F 
   INNER JOIN 
       [AMData].[dbo].[AttendanceTypes] T ON F.[AbsID] = T.[FocusID]
   WHERE 
       NOT EXISTS (SELECT * 
                   FROM [AMData].[dbo].[AttendanceRecord] A, [Focus].[dbo].[AllAbsence] F
                   WHERE A.[EhrID] = F.[EHrID]
                     AND F.[EHrDate] BETWEEN '2018/01/01' AND '2018/12/01'
                     AND F.[AbsID] <> 0 
                     AND F.[AbsID] <> 2);

尝试运行代码时出现语法错误。我不习惯运行插入代码,因此可能显然是错误的。

标签: sql-server

解决方案


一个猜测,但我怀疑问题是您正在为 table 别名AttendanceRecord。您不能在INSERT子句中为表设置别名。该错误实际上是在告诉您:

Ln:1 Col:47 - 'A' 附近的语法不正确

删除A,这将起作用(好吧,下面的 SQL 没有语法错误,所以我松散地使用“工作”这个词):

INSERT INTO [AMData].[dbo].[AttendanceRecord] ([TypeID],
                                               [Date],
                                               [EmpID],
                                               [EhrID],
                                               [SickReason],
                                               [AbsID])
SELECT T.[ID],
       F.[EHrDate],
       F.[EHrEmpID],
       F.[EHrID],
       F.[EHRUserComment],
       F.[AbsID]
FROM [Focus].[dbo].[AllAbsence] AS F
     INNER JOIN [AMData].[dbo].[AttendanceTypes] AS T ON F.[AbsID] = T.[FocusID]
WHERE NOT EXISTS (SELECT *
                  FROM [AMData].[dbo].[AttendanceRecord] AS A,
                       [Focus].[dbo].[AllAbsence] AS F
                  WHERE A.[EhrID] = F.[EHrID]
                    AND F.[EHrDate] BETWEEN '2018/01/01' AND '2018/12/01'
                    AND F.[AbsID] <> 0
                    AND F.[AbsID] <> 2);

推荐阅读