[英]What is wrong with my T-SQL syntax?
当我尝试运行此语句时,我不断收到以下错误消息。 我在SSIS中的OLE DB命令中运行它。
')'附近的语法不正确
显然,这是一个易于阅读的错误消息,但我不知道为什么要得到它。 我检查了T-SQL文档,并确定在需要的地方加上括号。
INSERT INTO
dbo.Table1 (
[ID],
[Supplier],
[Level],
[Status],
[Core],
[Location],
[Outsourced],
[Contact],
[Phone],
[Email]
)
SELECT
[ID],
[Supplier],
[Level],
[Status],
[Core],
[Location],
[Outsourced],
[Contact],
[Phone],
[Email]
FROM
dbo.Table2
WHERE
NOT (
[ID],
[Supplier],
[Level],
[Status],
[Core],
[Location],
[Outsourced],
[Contact],
[Phone],
[Email] IN (
SELECT
[ID],
[Supplier],
[Level],
[Status],
[Core],
[Location],
[Outsourced],
[Contact],
[Phone],
[Email]
FROM
dbo.table1
)
)
马丁·史密斯(Martin Smith)对马里·阿里(A.Ali)的回答写了一个很好的评论 -您确定在这里做对了吗? 如果两个表中任何列中的任何值都不相同,则select语句将返回它。
这意味着,如果表2中有一条记录具有相同的值,但表1中有一条记录,则select语句将返回它,并且您可能会遇到最坏的主键冲突错误-重复行(除非表1中的单个列)。
考虑到这一点,您可能应该做的是从表2中选择键1在表1中不存在的所有记录,表2是任何唯一约束或索引的一部分,而不仅仅是主键。
因此,假设ID
是主键,并且为了进行演示,您在Phone
和Email
上具有唯一索引,那么您需要的是这样的:
INSERT INTO
dbo.Table1 (
[ID],
[Supplier],
[Level],
[Status],
[Core],
[Location],
[Outsourced],
[Contact],
[Phone],
[Email]
)
SELECT
[ID],
[Supplier],
[Level],
[Status],
[Core],
[Location],
[Outsourced],
[Contact],
[Phone],
[Email]
FROM
dbo.Table2 t2
WHERE NOT EXISTS
(
SELECT 1
FROM Table1 t1
WHERE t1.ID = t2.ID
OR (t1.Phone = t2.Phone AND t1.Email = t2.Email)
)
IN
运算符不能像在SQL Server中那样工作。 它的左侧只能有一个操作数,而右侧则可以有许多操作数,因此它基本上将单个值与列表进行比较。 T-SQL IN
运算符的工作方式如下:
Col IN(value1, value2....valuen)
相当于
Col = value1 or Col = value2....or Col = valuen`
它在标准SQL中有效,并且有支持它的数据库(例如MySql),但SQL Server不支持。
您正在寻找EXCEPT
:
INSERT INTO
dbo.Table1 (
[ID],
[Supplier],
[Level],
[Status],
[Core],
[Location],
[Outsourced],
[Contact],
[Phone],
[Email]
)
SELECT
[ID],
[Supplier],
[Level],
[Status],
[Core],
[Location],
[Outsourced],
[Contact],
[Phone],
[Email]
FROM
dbo.Table2
EXCEPT
SELECT
[ID],
[Supplier],
[Level],
[Status],
[Core],
[Location],
[Outsourced],
[Contact],
[Phone],
[Email]
FROM
dbo.table1
使用“ Exists
可以给您更快的查询,有时甚至比left join where righttable.PK_Column is null
查询)还要快。
INSERT INTO dbo.Table1
([ID],[Supplier],[Level],[Status],[Core],[Location]
,[Outsourced],[Contact],[Phone],[Email])
SELECT
[ID],
[Supplier],
[Level],
[Status],
[Core],
[Location],
[Outsourced],
[Contact],
[Phone],
[Email]
FROM
dbo.Table2 t2
WHERE NOT EXISTS ( SELECT 1
FROM dbo.table1 t1
WHERE t2.[ID] = t2.[ID]
t2.[Supplier] = t2.[Supplier]
t2.[Level] = t2.[Level]
t2.[Status] = t2.[Status]
t2.[Core] = t2.[Core]
t2.[Location] = t2.[Location]
t2.[Outsourced]= t2.[Outsourced]
t2.[Contact] = t2.[Contact]
t2.[Phone] = t2.[Phone]
t2.[Email] = t2.[Email]
)
IN的左侧恰好有一个列名,您不能在左侧放置一列列表。 老实说,我不确定您要在这里做什么……这没有任何意义。 但是您可能想要更多这样的东西:
WHERE
[ID] NOT IN (SELECT [ID] FROM dbo.Table1)
AND [Supplier] NOT IN (SELECT [Supplier] FROM dbo.Table1)
AND ...
但也许您的意思是这样的:
WHERE NOT EXISTS (SELECT 1 FROM dbo.Table1 WHERE Table1.ID = Table2.ID
AND Table1.Supplier = Table2.Supplier
AND ... )
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.