我收到了以下表格:
队
匹配
我希望获得如下输出:
matches.semana | teams.nom_equipo | teams.nom_equipo | Winner
1 AMERICA CRUZ AZUL AMERICA
1 SANTOS MORELIA MORELIA
1 LEON CHIVAS LEON
列teams.nom_equipo对matches.num_eqpo_lo& amp;到matches.num_eqpo_v,同时他们引用列teams.nom_equipo根据他们的id获取每个团队的名称
编辑:我使用了以下内容:
SELECT m.semana, t_loc.nom_equipo AS LOCAL, t_vis.nom_equipo AS VISITANTE,
CASE WHEN m.goles_loc > m.goles_vis THEN 'home'
WHEN m.goles_vis > m.goles_loc THEN 'visitor'
ELSE 'tie'
END AS Vencedor
FROM matches AS m
JOIN teams AS t_loc ON (m.num_eqpo_loc = t_loc.num_eqpo)
JOIN teams AS t_vis ON (m.num_eqpo_vis = t_vis.num_eqpo)
ORDER BY m.semana;
但是你可以从表格中看到来自goles_loc专栏(主队)的第5行比赛& goles_vis(访问者)专栏,他们有2对2(目标数量 - 主场vs访客)是平局,但当我运行代码时,我得到的东西不是平局:
匹配'得分
选择的结果集:
我还注意到,自第5行开始,比赛中两队的名字都不正确(访客和主队)。 因此,Select会带来正确的数据,但顺序与原始顺序不同(参考表格匹配的顺序)
第二周的订单必须是:
matches.semana | teams.nom_equipo | teams.nom_equipo | Winner
5 2 CRUZ AZUL TOLUCA TIE
6 2 MORELIA LEON LEON
7 2 CHIVAS SANTOS TIE
Resultset中的第8行必须是第5行,依此类推。
真的很感谢任何帮助!
答案 0 :(得分:2)
在为{}包含SELECT
列的null
时,它始终是值,因此您的案例中的winner
将永远不会被填充。
这样的事情可能更符合你的想法:
SELECT m.semana, t_loc.nom_equipo AS loc_equipo, t_vis.nom_equipo AS vis_equipo,
CASE WHEN m.goles_loc - m.goles_vis > 0 THEN t_loc.nom_equipo
WHEN m.goles_vis - m.goles_loc > 0 THEN t_vis.nom_equipo
ELSE NULL
END AS winner
FROM matches AS m
JOIN teams AS t_loc ON (m.nom_eqpo_loc = t.num_eqpo)
JOIN teams AS t_vis ON (m.nom_eqpo_vis = t.num_eqpo)
ORDER BY m.semana;
未经测试,但这应该提供一般方法。基本上,你JOIN
表teams
两次,但使用不同的条件,然后你需要计算得分。我在这里使用NULL
来表示平局。
根据OP的评论进行编辑:
它是同一个表 - teams
- 但JOIN
会产生不同的结果,因为查询使用了不同的JOIN
条件在每个JOIN
。
JOIN
的第一个t_loc
将m.nom_eqpo_loc
与t.num_eqpo
进行比较。这意味着它获得了主页团队的teams
行。
JOIN
的第二个t_vis
将m.nom_eqpo_vis
与t.num_eqpo
进行比较。这意味着它获得 visting 团队的teams
行。
因此,在CASE
声明中,t_loc
指的是主页团队,而t_vis
指的是 visting ,允许在CASE
语句中使用两者,为winning
启用正确的名称。
根据OP的后续评论进行编辑:
我的原始查询按m.semana
排序,这意味着其他列可以按任何顺序出现(基本上以 Postgres 认为最有效的方式)。
如果您希望对结果表的排序方式与matches
表完全相同,则在其ORDER BY
中使用相同的ORDER BY
元组。
因此,ORDER BY
子句将成为:
ORDER BY m.semana, m.nom_eqpo_loc, m.nom_eqpo_vis
基本上,matches
表PRIMARY KEY
元组。