JOIN中的CASE不能正常工作PostgreSQL

时间:2015-01-23 05:08:42

标签: postgresql join case

我收到了以下表格:

Teams

匹配

Matches

我希望获得如下输出:

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访客)是平局,但当我运行代码时,我得到的东西不是平局

匹配'得分

Matches

选择的结果集:

Result

我还注意到,自第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行,依此类推。

真的很感谢任何帮助!

1 个答案:

答案 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;

未经测试,但这应该提供一般方法。基本上,你JOINteams两次,但使用不同的条件,然后你需要计算得分。我在这里使用NULL来表示平局。

根据OP的评论进行编辑:

它是同一个表 - teams - 但JOIN会产生不同的结果,因为查询使用了不同的JOIN 条件在每个JOIN

JOIN的第一个t_locm.nom_eqpo_loct.num_eqpo进行比较。这意味着它获得了主页团队的teams行。

JOIN的第二个t_vism.nom_eqpo_vist.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

基本上,matchesPRIMARY KEY元组。