我对SQL请求有一个奇怪的结果,我在我的子请求中给出了一个未知字段" 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 |
+----------+
它返回与请求相同的结果:
select count(*) FROM rc.alert_events WHERE alert_event_load_time like '2015-08-04%' ;"
+----------+
| count(*) |
+----------+
| 237634 |
+----------+
这可能是个错误吗?
答案 0 :(得分: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%')
但是,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%')
没有错误,但您仍然可以获得结果集。
这种范围的使用被认为是SQL语言的“特性”。我的建议是永远不要使用此功能。 始终使用表别名和限定列名(好吧,如果查询中只有一个表,那么你可以放松一点)。