SQL 中删除语法的问题 - 当子查询没有与 EXISTS 一起引入时,错误只能在选择列表中指定一个表达式
Posted
技术标签:
【中文标题】SQL 中删除语法的问题 - 当子查询没有与 EXISTS 一起引入时,错误只能在选择列表中指定一个表达式【英文标题】:Problem with delete syntax in SQL - Error Only one expression can be specified in the select list when the subquery is not introduced with EXISTS 【发布时间】:2019-04-03 00:07:30 【问题描述】:我有这个 SQL 查询:
SELECT NumeroReloj, Badgenumber, Name, lastname, DEFAULTDEPTID
FROM [PBS].[dbo].[CAT_Empleados]
RIGHT JOIN [AccessControl].[dbo].[USERINFO]
ON [PBS].[dbo].[CAT_Empleados].[NumeroReloj] = [AccessControl].[dbo].[USERINFO].[Badgenumber] COLLATE Chinese_PRC_CI_AS
WHERE [AccessControl].[dbo].[USERINFO].[Badgenumber] COLLATE Chinese_PRC_CI_AS NOT IN (SELECT [NumeroReloj] FROM [PBS].[dbo].[CAT_Empleados])
有2个数据库,2个不同名字的表。
通过该查询,我得到了一些在表 [AccessControl].[dbo].[USERINFO] 中但不在表 [PBS].[dbo].[CAT_Empleados] 中的用户。
[AccessControl].[dbo].[USERINFO] 的 Employee# 列被命名为“Badgenumber”,[PBS].[dbo].[CAT_Empleados] 的 Employee# 列被命名为“NumeroReloj”(就是这样匹配两个结果)。
嗯,该查询运行良好,现在我想在 [AccessControl].[dbo].[USERINFO] 中删除与该 Select 查询相同的结果。我试过了:
DELETE
FROM [AccessControl].[dbo].[USERINFO]
WHERE [AccessControl].[dbo].[USERINFO].[Badgenumber] IN (SELECT * FROM [PBS].[dbo].[CAT_Empleados] RIGHT JOIN [AccessControl].[dbo].[USERINFO] ON [PBS].[dbo].[CAT_Empleados].[NumeroReloj] = [AccessControl].[dbo].[USERINFO].[Badgenumber] COLLATE Chinese_PRC_CI_AS WHERE [AccessControl].[dbo].[USERINFO].[Badgenumber] COLLATE Chinese_PRC_CI_AS NOT IN (SELECT [NumeroReloj] FROM [PBS].[dbo].[CAT_Empleados])
但我收到此错误消息:
Msg 116, Level 16, State 1, Line 3 只能使用一个表达式 未引入子查询时在选择列表中指定 存在。
【问题讨论】:
【参考方案1】:您遇到的问题是您的删除语句,您要求在返回多个字段的子查询中仅删除带有徽章编号的员工,如“*”所示。所以 SQL 不知道您希望将 badgenumber 与什么进行比较。
更改子查询中的“*”以匹配 1 个字段,即您要与徽章编号进行比较的字段。
【讨论】:
谢谢你 alex067,它有效。我刚刚将 * 更改为 Badgenumber。以上是关于SQL 中删除语法的问题 - 当子查询没有与 EXISTS 一起引入时,错误只能在选择列表中指定一个表达式的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server 错误:当子查询没有用 EXISTS 引入时,选择列表中只能指定一个表达式