sql - 为什么这个带有 in 子句的查询不返回错误?
问题描述
我已经在 sqlfiddle.com 上的不同数据库上尝试过这个
CREATE TABLE a (
a_col1 int NOT NULL
);
CREATE TABLE b (
b_col1 int NOT NULL
);
select * from a where a_col1 in (select a_col1 from b);
“从 b 中选择 a_col1”中的错误不明显吗?填充表 a 它至少在 MySQL 中返回表 a 中的所有行。
解决方案
编译器完全没有错误,只有编写代码的人才会出错。你认为代码说:
where a.a_col1 in (select b.a_col1 from b);
但这不是 SQL 范围规则的工作方式。 a_col1
中未找到b
,因此 SQL 假定这是一个相关子查询并将其解释为:
where a.a_col1 in (select a.a_col1 from b);
没有奥秘。只是一个坏习惯。 始终限定查询中的列引用。