奇怪的SQL请求包含未知字段

时间:2015-08-13 13:09:01

标签: mysql sql

我对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 |
+----------+

这可能是个错误吗?

1 个答案:

答案 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语言的“特性”。我的建议是永远不要使用此功能。 始终使用表别名和限定列名(好吧,如果查询中只有一个表,那么你可以放松一点)。