相关疑难解决方法(0)

为什么这个查询有效?

我有两个表,table_a (id, name) 和 table_b (id),假设在 Oracle 12c 上。

为什么这个查询不返回异常?

select * from table_a where name in (select name from table_b);
Run Code Online (Sandbox Code Playgroud)

据我了解,Oracle 认为这是

select * from table_a where name = name;
Run Code Online (Sandbox Code Playgroud)

但我不明白的是为什么?

oracle subquery select

36
推荐指数
2
解决办法
5443
查看次数

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

是否有任何解释可以解释为什么 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
查看次数