我在 MySQL 数据库中有两个表 -t1一个列c1,t2一个列c2。
我运行这个查询:
select * from t1 where c1 in (select c1 from t2);
Run Code Online (Sandbox Code Playgroud)
上面的查询应该给出一个错误,因为c1t2 中不存在。相反,它返回t1. 上述查询的另一个版本delete可能会造成更大的灾难:
delete from t1 where c1 in (select c1 from t2);
Run Code Online (Sandbox Code Playgroud)
当上面的查询只是应该给出错误时,它会删除 t1 中的所有行。
我注意到只有当子查询中的列与外部列具有相同的名称时才会发生这种行为。意义,
select * from t1 where c1 in (select c3 from t2);
Run Code Online (Sandbox Code Playgroud)
将按预期抛出错误:
ERROR 1054 (42S22): Unknown column 'c3' in 'field list'
Run Code Online (Sandbox Code Playgroud)
顺便说一句,我已经在 PostgreSQL 9.6.3 上检查过同样的问题,行为完全相同。对这种奇怪的行为有什么解释吗?
subquery ×1