奇怪的SQL请求与未知字段

tos*_*o92 4 mysql sql

我对SQL请求有一个奇怪的结果,我在子请求中为"alerts"表提供了一个未知字段"alert_event_load_time",但是存在于"alert_events"表中,但是我得到的结果是:

"select count(*) FROM rc.alert_events WHERE 
alert_id in 
(select alert_id from rc.alerts where alert_event_load_time like '2015-08-04%');"

+----------+
| count(*) |
+----------+
|   237634 |
+----------+
Run Code Online (Sandbox Code Playgroud)

它返回与请求相同的结果:

select count(*) FROM rc.alert_events WHERE alert_event_load_time like '2015-08-04%' ;"

+----------+
| count(*) |
+----------+
|   237634 |
+----------+
Run Code Online (Sandbox Code Playgroud)

它可能是一个错误吗?

Gor*_*off 7

让我们放入一些表别名.您认为查询是:

SELECT count(*)
FROM rc.alert_events ae
WHERE ae.alert_id in (select a.alert_id from rc.alerts a
                      where a.alert_event_load_time like '2015-08-04%')
Run Code Online (Sandbox Code Playgroud)

但是,alerts.alert_event_load_time不存在.因此,SQL(通常)查找下一个外部作用域以解析列别名.它找到了它.所以,查询是:

SELECT count(*)
FROM rc.alert_events ae
WHERE ae.alert_id in (select a.alert_id from rc.alerts a
                      where ae.alert_event_load_time like '2015-08-04%')
Run Code Online (Sandbox Code Playgroud)

没有错误,但您仍然可以获得结果集.

这种范围的使用被认为是SQL语言的"特征".我的建议是永远不要使用此功能. 始终使用表别名和限定列名(好吧,如果查询中只有一个表,那么你可以放松一下).