【问题标题】:Left Join with temporary RANK() columnLeft Join 与临时 RANK() 列
【发布时间】:2022-09-29 13:42:45
【问题描述】:

我试图 LEFT JOIN 一个列,其中使用 rank() 计算值和另一个表(点)中的查找列。

查询如下所示:

SELECT *, id, Entry.Fin_place, Athlete.First_name, Athlete.Last_name, 
      Fin_Time, Points.Fin_points, Athlete.Ath_no,
      Athlete.Team_no,Team.Team_no,Team.Team_abbr, 
      DENSE_RANK() OVER ( ORDER BY `Fin_Time` DESC) AS rankz 
FROM `Entry` 
LEFT JOIN Athlete ON Entry.Ath_no = Athlete.Ath_no
LEFT JOIN Team ON Athlete.Team_no = Team.Team_no
LEFT JOIN Points ON rankz = Points.Fin_place;

MySQL 说:#1054 - \'on 子句\'中的未知列 \'rankz\'

必须使用临时 Rank() 值从 Points 表中查找和显示 Fin_points,但我不断收到错误消息。

有关上下文的更多信息: 这入口桌子: 空白列是必须使用 Rankz 值来查找 Fin_points 值的地方积分桌子

  • 你能提供一些样本数据吗?

标签: mysql


【解决方案1】:

使用表或表别名限定列名在发布时很有帮助,因此我们可以看到代码可以在哪里拆分。假设 fin_time 存在于前 3 个调用表之一中,您可以将该块代码停放在 cte 和连接点中,例如

with cte as
(
SELECT *, id, Entry.Fin_place, Athlete.First_name, Athlete.Last_name, 
      Fin_Time, #Points.Fin_points, 
      Athlete.Ath_no,
      Athlete.Team_no,Team.Team_no,Team.Team_abbr, 
      DENSE_RANK() OVER ( ORDER BY `Fin_Time` DESC) AS rankz 
FROM `Entry` 
LEFT JOIN Athlete ON Entry.Ath_no = Athlete.Ath_no
LEFT JOIN Team ON Athlete.Team_no = Team.Team_no
)
select * , Points.Fin_points
from cte
LEFT JOIN Points ON rankz = Points.Fin_place; 

您的代码错误的原因是因为 rankz 在加入时不存在。

【讨论】:

  • 嗨,我收到以下错误:无法识别的语句类型。 (靠近位置 0 的“with”) SQL 查询:复制文档 #1064 - 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以在第 2 行的“SELECT *, id, Entry.Fin_place, Athlete.First_name, Athlete.Last_name, ...”附近使用正确的语法
  • 抱歉,在 as - 代码编辑后丢失了左括号。
猜你喜欢
  • 2010-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-03
  • 2014-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多