クエリのスペルを間違え、MySQLの奇妙な動作に直面しました。
create table aaa (id bigint auto_increment primary key,
amount int not null,
other_column varchar(20)) engine=InnoDB
create table bbb (aaa_id bigint not null,
comment varchar(200),
key(aaa_id)) engine=InnoDB;
insert into aaa(other_column, amount) values ('hello, world', 12),
('second string', 15),
('one more', 100);
insert into bbb value (2, 'no 2s!');
次のクエリはnull
結果を生成します(「aaa_id」ではなく「id」と入力しました)。
select sum(amount) from aaa where id not in (select id from bbb);
「たぶん 『id』はMySQLにとって特別な意味を持っている」と私は思いました。ただし、次のクエリは正常に実行され、127
(サブクエリが空の結果を返すかのように)返されます。
select sum(amount) from aaa where id not in (select other_column from bbb);
次のクエリは期待される結果を生成します。最初のクエリはで失敗しUnknown column 'id2' in 'field list'
、2番目のクエリは次を返します112
。
select sum(amount) from aaa where id not in (select id2 from bbb);
select sum(amount) from aaa where id not in (select aaa_id from bbb);
ご覧のとおり、列が外部クエリに存在する場合、MySQLは何らかの形でサブクエリを実行します。しかし、サブクエリのこれらの列の意味は何ですか?
5.1.70および5.5でテスト済み。
このクエリ:
select sum(amount)
from aaa
where id not in (select id from bbb);
次のように解釈されます:
select sum(aaa.amount)
from aaa
where aaa.id not in (select aaa.id from bbb);
bbb.id
存在しないので。SQLを作成するときは、常にテーブルエイリアスを使用することをお勧めします。あなたが書いていると思ったクエリ:
select sum(aaa.amount)
from aaa
where aaa.id not in (select bbb.id from bbb);
予期したエラーが発生します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加