我有两个表,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)
但我不明白的是为什么?
是否有任何解释可以解释为什么 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)