sql - 对多个参数执行“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
等等
解决方案
为了使您自己的查询工作,您需要每个部分查询都有一个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]
是一种特殊的联合形式,可以去除重复项。
推荐阅读
- html - css2pdf xepOnline Cloudformatter - Hide elements in html but display in PDF
- swift - 如何将accessibilityIdentifier 设置为UIAlertActions?
- node.js - Json数组(动态键)+表格格式+angular5
- javascript - 在Extjs中的页面加载上隐藏文本字段上的光标
- javascript - JavaScript 匹配字符串数组的重音符号
- c# - Unity如何在预制件中关闭所有灯
- reactjs - 如何在 VS Code 中为 React Native 安装 Flow(代码建议)?
- php - 删除 WordPress 的附加图像大小后自动删除无用的附件元数据
- jquery - 我已经通过 jquery 插入了 linearGradient 标签 svg,但是 Gradient g 变小了我应该怎么做?
- actionscript-3 - 在 Datagride 中为动态列设置值