我正在尝试在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
或结果错误。 / p>
我也看过像这样子查询:
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
等
答案 0 :(得分:2)
要使自己的查询正常工作,您希望每个部分查询都包含一个 ORDER BY
(和 LIMIT
)子句。为此,请使用括号:
(
SELECT分数,ClubID
从ShootRecords
在哪里ShootRecords.ClubID = 0
按分数排序
极限5
)
全联盟
(
SELECT分数,ClubID
从ShootRecords
在哪里ShootRecords.ClubID = 1
按分数排序
极限5
)
按ClubID排序,得分DESC;
顺便说一下,它是 UNION ALL
。 UNION [DISTINCT]
是一种特殊的联合形式,可删除重复项。
答案 1 :(得分:0)
每个组的前n个查询通常使用解析函数来解决,但是HSQLDB不支持它们。
无论如何,要进入前五名就意味着好不到五个。
select *
from shootrecords sr
where 5 >
(
select count(*)
from shootrecords better
where better.clubid = sr
and
( better.score > sr.score
or
(better.score = sr.score and better.memberid < sr.memberid) -- for the case of ties
)
)
order by clubid, score, memberid;
如果出现平局(具有相同分数的多个成员),我必须任意选择成员。我首先选择ID最低的那些。