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サーバー2008を使用すると、結果はテーブルMytable1のすべての行になります

それはSQLのバグですか?

4

2 に答える 2

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はこちら)

于 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 に答える