对多个参数执行 "SELECT TOP 5" 最简单的方法是什么?
What is the simplest way to do "SELECT TOP 5" for multiple parameters?
我正在尝试在 LibreOffice Base / HSQLDB 中构建一个新数据库,据说它支持标准 SQL,但可能不如 SQL-server 或甲骨文
我有一个 table 分数,其中参与者是俱乐部列表之一的成员。我需要生成 "Team Scores" 球队是动态的,即它们由每个俱乐部的前 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
等等
每组TOP 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 最低的。
要使您自己的查询正常工作,您需要每个部分查询有一个 ORDER BY
(和 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]
是一种特殊形式的联合,可以删除重复项。
我正在尝试在 LibreOffice Base / HSQLDB 中构建一个新数据库,据说它支持标准 SQL,但可能不如 SQL-server 或甲骨文
我有一个 table 分数,其中参与者是俱乐部列表之一的成员。我需要生成 "Team Scores" 球队是动态的,即它们由每个俱乐部的前 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
等等
每组TOP 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 最低的。
要使您自己的查询正常工作,您需要每个部分查询有一个 ORDER BY
(和 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]
是一种特殊形式的联合,可以删除重复项。