首页 > 解决方案 > 对多个参数执行“SELECT TOP 5”的最简单方法是什么?

问题描述

我正在尝试在 LibreOffice Base / HSQLDB 中构建一个新数据库,该数据库据称支持标准 SQL,但可能不如 SQL-server 或 Oracle 广泛。

我有一张分数表,其中参与者是俱乐部列表中的一个成员。我需要在团队动态的情况下生成“团队得分”,即它们由每个俱乐部的前 5 名得分组成。

到目前为止,我能够实现的最接近的是:

SELECT "Score", "ShootRecords"."ClubID" FROM  "ShootRecords" WHERE "ShootRecords"."ClubID" = 0

UNION 

SELECT "Score", "ShootRecords"."ClubID" FROM  "ShootRecords" WHERE "ShootRecords"."ClubID" = 1

ORDER BY "Score" DESC

如果我TOP 5 在每个子查询的开头添加一个限定符,它会报告为无效 SQL。如果我将该ORDER BY子句移动到子查询中,它再次报告为无效 SQL,但每个子查询都需要以这种方式排序,并且限制为TOP 5或结果错误。

我还研究过像这样进行子查询:

SELECT "ClubID"

FROM   "Clubs"

WHERE  "Clubs"."ClubID" IN

   (SELECT "ClubID"

    FROM "Clubs", "ShootRecords"

    WHERE "Clubs"."ClubID" = "ShootRecords"."ClubID"
    )

但是再次以错误的顺序完成排序和子设置,或者无效。

我希望看到的看起来像:

Score     ClubID
------------------
300        0
299        0
280        0
200        0
190        0
310        1
290        1
277        1

等等

标签: sqlhsqldblibreoffice-base

解决方案


为了使您自己的查询工作,您需要每个部分查询都有一个ORDER BY(and LIMIT) 子句。为此,请使用括号:

(
  SELECT Score, ClubID 
  FROM ShootRecords 
  WHERE ShootRecords.ClubID = 0
  ORDER BY Score DESC
  LIMIT 5
)
UNION ALL
(
  SELECT Score, ClubID 
  FROM ShootRecords 
  WHERE ShootRecords.ClubID = 1
  ORDER BY Score DESC
  LIMIT 5
)
ORDER BY ClubID, Score DESC;

UNION ALL顺便说一句。UNION [DISTINCT]是一种特殊的联合形式,可以去除重复项。


推荐阅读