用 CTE 清理查询
在第 2 章中,您生成了一个国家列表,以及每个国家中总进球数超过 10 的比赛数量。该练习中的查询在 FROM 子句中使用了子查询,以便在主查询计数之前先筛选比赛。下面是您当时创建的查询:
SELECT
c.name AS country,
COUNT(sub.id) AS matches
FROM country AS c
INNER JOIN (
SELECT country_id, id
FROM match
WHERE (home_goal + away_goal) >= 10) AS sub
ON c.id = sub.country_id
GROUP BY country;
您可以在主查询之前先"声明"一个或多个子查询为公用表表达式(CTE),这是一种很好的方式,用于组织信息并使逻辑更清晰。
在本练习中,我们将使用一个 CTE 来改写一个类似的查询。
本练习是课程的一部分
SQL 中的数据处理
练习说明
- 完成语法以声明您的 CTE。
- 在 CTE 中从
match表选择country_id和比赛id。 - 使用
country_id将该 CTE 与 league 表进行LEFT JOIN。
交互式实操练习
通过完成这段示例代码来试试这个练习。
-- Set up your CTE
___ match_list ___ (
SELECT
country_id,
___
FROM match
WHERE (home_goal + away_goal) >= 10)
-- Select league name and count of matches from the CTE
SELECT
l.name AS league,
COUNT(match_list.id) AS matches
FROM league AS l
-- Join the CTE to the league table using country_id
LEFT JOIN ___ ON l.id = ___
GROUP BY l.name;