在这个例子中,我觉得我不应该犯这个错误:
create table A (A_ID int);
create table B (B_ID int, OTHER_ID int);
insert into A values (123);
insert into B values (456, 123);
select * from A where A_ID in (select A_ID from B);
Run Code Online (Sandbox Code Playgroud)
正确的查询是这样的:
select * from A where A_ID in (select OTHER_ID from B);
Run Code Online (Sandbox Code Playgroud)
由于表B中不存在A_ID,为什么查询不会抛出错误,或者至少失败?
编辑:谢谢你的回复!但是,要明确的是,我的问题不是"这样做的正确方法是什么?",我只是好奇为什么这会起作用.
在具有多个列的写入查询时,应始终包含限定的表名.您的第一个查询被解释为:
select a.*
from A a
where a.A_ID in (select a.A_ID from B b);
Run Code Online (Sandbox Code Playgroud)
这称为相关子查询.除了FROM条款外,它们在任何地方都被允许.
您应该将查询编写为:
select a.*
from A a
where a.A_ID in (select b.OTHER_ID from B b);
Run Code Online (Sandbox Code Playgroud)
这可以防止任何错误.如果您最初对列名称进行了限定,那么您的查询将(可能)生成错误:
select a.*
from A a
where a.A_ID in (select b.A_ID from B b);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
77 次 |
| 最近记录: |