4
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 中的错误吗?

4

2 回答 2

6

不,这不是错误。

如果将表别名添加到整个查询中使用的字段,您可以更清楚地看到发生了什么:

select * from Mytable1 mt1 
where mt1.Fname in (select mt1.Fname from Mytable2 mt2)

- IE。子查询引用(并返回)来自主查询的值。

如果将查询更改为:

select * from Mytable1 mt1 
where mt1.Fname in (select mt2.Fname from Mytable2 mt2)

- 你得到一个错误。

(这里的 SQLFiddle )

于 2013-04-09T09:06:36.127 回答
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)
于 2013-04-09T08:58:50.253 回答