【发布时间】:2016-09-22 21:05:36
【问题描述】:
我在 Codecademy 上做这个练习几天了,仍然无法理解它背后的逻辑。下面是练习和代码:
通过按时间和承运人为航班提供序列号来订购航班会很有趣。 例如,假设每增加一个航班,flight_id 就会增加,我们可以使用以下查询按航空公司、航班 ID 和序列号查看航班:
SELECT carrier, id,
(SELECT COUNT(*)
FROM flights f
WHERE f.id < flights.id
AND f.carrier=flights.carrier) + 1 AS flight_sequence_number
FROM flights;
我可以理解f是表flights的虚拟形式,但是f.id < flights.id是做什么的呢?是不是意味着SQL会比较f中的每一行和flights中的每一行类似
比较 MQ 17107 与 MQ 7869,
比较 MQ 17107 与 MQ 2205,
比较 MQ 17107 和 MQ 14979
……
比较 MQ 7869 与 MQ 2205,
比较 MQ 7869 和 MQ 14979
……
另外,这个COUNT(*) 到底算什么?为什么+1?
这是结果图片:query result
任何帮助将不胜感激。谢谢。
【问题讨论】:
-
统计当前id前的航班数,加1。
-
良好的编程习惯有两个不同的表别名。例如。 f1 和 f2 在这里。
-
有了modern SQL,使用简单的窗口函数可以更轻松地完成:
row_number() over (partition carrier order by id)- 不需要子查询。 -
@jarlh 谢谢,你能告诉我 f.id
标签: sql subquery correlated-subquery