如何根据 table b 中的行数读取 table a 的前 n 行?
How can I read the first n rows of table a based upon the number of rows in table b?
我有一个 table“L20”,其中包含 1 到 20 个值“HDIF”,按升序排列。我需要将这些值的前 1 到 10 个提取到 table“T10”中,具体取决于 table“L20”中值的数量。我正在使用 Windows 10,Libreoffice 6.4.4,以及 Firebird 3 数据库。我已经在“L20”中的 COUNT 行上尝试了 CASE 语句和 DECODE 语句,但似乎都不起作用。
如果我在 table“L20”上为 SELECT 输入数字,那么它可以正常工作。任何人都知道如何解决?此查询的目的是计算高尔夫差点,它使用 [最多] 最近(最近)20 场比赛的最佳(最低)10 分。这是编码:
/* Qry_Index_Calc - calculates handicap index from top 10 differentials of last 20 games */
/* Source is "VW_Plyr_Diff" which has handicap differentials already calculated. */
SELECT (AVG ("T10"."HDIF") * .96) "Index", (Count ("T10"."HDIF")) FROM
/* Get only the games needed if less than 20 games have been played. */
(
SELECT FIRST
DECODE ((SELECT COUNT (*) FROM "L20"),
1, 1
, 2, 1
, 3, 1
, 4, 1
, 5, 1
, 6, 1
, 7, 2
, 8, 2
, 9, 3
, 10, 3
, 11, 4
, 12, 4
, 13, 5
, 14, 5
, 15, 6
, 16, 6
, 17, 7
, 18, 8
, 19, 9
, 10)
"L20"."HDIF"
FROM
/* Get up to 20 of the most recent (last) games played. */
( SELECT FIRST 20 "PlayerID" "PID", "GID" "GID",
RANK ( ) OVER ( PARTITION BY "PlayerID" ORDER BY "Diff" ) "Rnk",
"Diff" "HDIF", "Date" "Gdate"
FROM "Vw_Plyr_Diff"
WHERE "PlayerID" = 1)
"L20"
) "T10"
您需要将 FIRST
中的表达式括起来。如 Firebird 3.0 Language Reference for FIRST
, SKIP
中指定:
SELECT
[FIRST <m>] [SKIP <n>]
FROM ...
...
<m>, <n> ::=
<integer-literal>
| <query-parameter>
| (<integer-expression>)
所以,使用
select first (decode(...)) ....
直接在first
中使用子查询时,需要使用双括号(一次用于表达式,一次用于表达式中的子查询用括号括起来。
Firebird 3 中引入的 SQL 标准 OFFSET
/FETCH
子句不支持表达式。
请注意,您当前的代码未指定 ORDER BY
,这意味着未定义确切返回哪些行,这将取决于数据在数据库中的位置、访问计划等。我建议您添加适当的 ORDER BY
子句以确保返回的行符合预期。
看起来您正试图从 FROM
子句中定义的派生 table L20
中 SELECT
,而不是从实际的 table L20
。如果您希望能够做到这一点,那么 L20
最常被指定为 common table expression.
我有一个 table“L20”,其中包含 1 到 20 个值“HDIF”,按升序排列。我需要将这些值的前 1 到 10 个提取到 table“T10”中,具体取决于 table“L20”中值的数量。我正在使用 Windows 10,Libreoffice 6.4.4,以及 Firebird 3 数据库。我已经在“L20”中的 COUNT 行上尝试了 CASE 语句和 DECODE 语句,但似乎都不起作用。
如果我在 table“L20”上为 SELECT 输入数字,那么它可以正常工作。任何人都知道如何解决?此查询的目的是计算高尔夫差点,它使用 [最多] 最近(最近)20 场比赛的最佳(最低)10 分。这是编码:
/* Qry_Index_Calc - calculates handicap index from top 10 differentials of last 20 games */
/* Source is "VW_Plyr_Diff" which has handicap differentials already calculated. */
SELECT (AVG ("T10"."HDIF") * .96) "Index", (Count ("T10"."HDIF")) FROM
/* Get only the games needed if less than 20 games have been played. */
(
SELECT FIRST
DECODE ((SELECT COUNT (*) FROM "L20"),
1, 1
, 2, 1
, 3, 1
, 4, 1
, 5, 1
, 6, 1
, 7, 2
, 8, 2
, 9, 3
, 10, 3
, 11, 4
, 12, 4
, 13, 5
, 14, 5
, 15, 6
, 16, 6
, 17, 7
, 18, 8
, 19, 9
, 10)
"L20"."HDIF"
FROM
/* Get up to 20 of the most recent (last) games played. */
( SELECT FIRST 20 "PlayerID" "PID", "GID" "GID",
RANK ( ) OVER ( PARTITION BY "PlayerID" ORDER BY "Diff" ) "Rnk",
"Diff" "HDIF", "Date" "Gdate"
FROM "Vw_Plyr_Diff"
WHERE "PlayerID" = 1)
"L20"
) "T10"
您需要将 FIRST
中的表达式括起来。如 Firebird 3.0 Language Reference for FIRST
, SKIP
中指定:
SELECT [FIRST <m>] [SKIP <n>] FROM ... ... <m>, <n> ::= <integer-literal> | <query-parameter> | (<integer-expression>)
所以,使用
select first (decode(...)) ....
直接在first
中使用子查询时,需要使用双括号(一次用于表达式,一次用于表达式中的子查询用括号括起来。
Firebird 3 中引入的 SQL 标准 OFFSET
/FETCH
子句不支持表达式。
请注意,您当前的代码未指定 ORDER BY
,这意味着未定义确切返回哪些行,这将取决于数据在数据库中的位置、访问计划等。我建议您添加适当的 ORDER BY
子句以确保返回的行符合预期。
看起来您正试图从 FROM
子句中定义的派生 table L20
中 SELECT
,而不是从实际的 table L20
。如果您希望能够做到这一点,那么 L20
最常被指定为 common table expression.