我对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)
它可能是一个错误吗?
让我们放入一些表别名.您认为查询是:
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语言的"特征".我的建议是永远不要使用此功能. 始终使用表别名和限定列名(好吧,如果查询中只有一个表,那么你可以放松一下).