小编Rav*_* HV的帖子

为什么这个无效的子查询不会引发语法错误?

是否有任何解释可以解释为什么 SSMS 没有为以下带有本身无效的子查询的删除查询引发任何编译错误?

以下是重现该行为的步骤序列:

CREATE TABLE [dbo].[delete_test]
(
    [id] [int] IDENTITY(1,1) NOT NULL,
    [name] [nchar](10) NOT NULL
) ON [PRIMARY];
Run Code Online (Sandbox Code Playgroud)

种子数据:

insert dbo.delete_test(name) values(N'a'),(N'b'),(N'c'),(N'd'),(N'e');
Run Code Online (Sandbox Code Playgroud)

创建备份表:

select id, name
  into dbo.delete_test_backup 
  from dbo.delete_test where id > 2;
Run Code Online (Sandbox Code Playgroud)

理想情况下,下面的语句不应执行,即使它执行,也应仅删除id具有已备份值的行:

delete dbo.delete_test where id in (
    select id delete_test_backup 
);
Run Code Online (Sandbox Code Playgroud)

该消息显示删除了 5 行,但我预计只有 3 行被删除:

(5 row(s) affected)
Run Code Online (Sandbox Code Playgroud)

尝试将子查询作为独立执行失败:

select id delete_test_backup ;
Run Code Online (Sandbox Code Playgroud)

无效的列名“id”

下面一个按预期执行:

select id from dbo.delete_test_backup ;
Run Code Online (Sandbox Code Playgroud)

输出 :

id
--
3
4
5
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql sql-server-2008-r2

6
推荐指数
1
解决办法
1149
查看次数

标签 统计

sql-server ×1

sql-server-2008-r2 ×1

t-sql ×1