如何筛选含C罗或梅西的赛事并获取全部球队与球员数据?
解决思路与SQL实现
原SQL语句的问题在于,将参与者的筛选条件直接放在WHERE子句中,导致JOIN后的结果集仅保留了名字为ronaldo或messi的参与者记录,而非整个赛事的全部数据。
要实现需求,需要先筛选出C罗或梅西参与的所有赛事ID,再基于这些赛事ID关联获取对应的全部球队和球员数据,具体有两种常用写法:
方法一:子查询筛选目标赛事
SELECT * FROM matches m INNER JOIN teams t ON t.matches_matchId = m.matchId INNER JOIN participants p ON p.matches_matchId = m.matchId WHERE m.matchId IN ( -- 先获取包含C罗或梅西的所有赛事ID SELECT DISTINCT matches_matchId FROM participants WHERE name IN ('ronaldo', 'messi') );
方法二:CTE(公共表表达式)筛选目标赛事
如果需要更清晰的逻辑拆分,可以用CTE先定义目标赛事集合:
WITH target_matches AS ( SELECT DISTINCT matches_matchId FROM participants WHERE name IN ('ronaldo', 'messi') ) SELECT * FROM matches m INNER JOIN target_matches tm ON m.matchId = tm.matches_matchId INNER JOIN teams t ON t.matches_matchId = m.matchId INNER JOIN participants p ON p.matches_matchId = m.matchId;
关键说明
- 子查询/CTE中的
DISTINCT用于去重,避免同一赛事因C罗和梅西同时参与而被多次返回,提升查询效率。 - 主查询仅针对筛选出的赛事ID进行关联,因此能返回这些赛事的全部球队信息和所有参赛球员数据,而不仅仅是C罗或梅西的记录。
内容的提问来源于stack exchange,提问作者Kareem Kamal
相关产品推荐
相关产品推荐

