这是SQL Server 2008中的错误吗?

时间:2013-04-09 08:52:28

标签: sql sql-server-2008

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

2 个答案:

答案 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)