create table Mytable1
(ID int,
Fname varchar(50)
)
create table Mytable2
(ID int,
Lname varchar(50)
)
insert into Mytable1 (ID,Fname)
values (1,'you')
insert into Mytable1 (ID,Fname)
values (2,'Tou')
insert into Mytable1 (ID,Fname)
values (3,'Nou')
insert into Mytable2 (ID,Lname)
values (1,'you2')
表Fname
中不存在字段Mytable2
但是我们有以下查询的结果:
select * from Mytable1 where Fname in (select Fname from Mytable2)
注意:我使用sql server 2008,结果是表Mytable1的所有行
这是SQL中的错误吗?
答案 0 :(得分:6)
不,这不是错误。
如果将表别名添加到整个查询中使用的字段,您可以看到更清楚的事情:
select * from Mytable1 mt1
where mt1.Fname in (select mt1.Fname from Mytable2 mt2)
- 即。子查询正在引用(并返回)主查询中的值。
如果您将查询更改为:
select * from Mytable1 mt1
where mt1.Fname in (select mt2.Fname from Mytable2 mt2)
- 你收到错误。
(SQLFiddle here)
答案 1 :(得分:0)
不,这不是错误:http://bugs.mysql.com/bug.php?id=26801
显然,这引用了Fname
中的Mytable1
:
mysql> select *, (select Lname from Mytable1 limit 1) from Mytable2 where Lname in (select Lname from Mytable1 );
+------+-------+--------------------------------------+
| ID | Lname | (select Lname from Mytable1 limit 1) |
+------+-------+--------------------------------------+
| 1 | you2 | you2 |
+------+-------+--------------------------------------+
1 row in set (0.01 sec)