如何根据表b中的行数读取表a的前n行?

vshtjzan  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(297)

我有一个表“l20”,其中包含1到20个值“hdif”,按升序排序。我需要根据表“l20”中的值的数量,将这些值中的前1到10个提取到表“t10”中。我使用的是windows10,libreoffice6.4.4,firebird3数据库。我试过case语句和decode语句来计算“l20”中的行数,但似乎两者都不起作用。
如果我在表“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"
cyvaqqii

cyvaqqii1#

您需要在中的表达式周围加括号 FIRST . 如firebird 3.0语言参考中所述 FIRST , SKIP :

SELECT
  [FIRST <m>] [SKIP <n>]
  FROM ...
  ...

<m>, <n>  ::=
    <integer-literal>
  | <query-parameter>
  | (<integer-expression>)

所以,使用

select first (decode(...)) ....

在中直接使用子查询时 first ,您需要使用双圆括号(一次用于表达式,一次用于表达式中的子查询被括在括号中的事实。
sql标准 OFFSET / FETCH firebird3中引入的子句不支持表达式。
注意,您当前的代码没有指定 ORDER BY ,这意味着返回哪些行是未定义的,这将取决于数据库中数据的位置、访问计划等。我建议您添加适当的 ORDER BY 子句以确保返回的行符合预期。
看起来你想 SELECT 从派生表 L20 定义在 FROM 子句,而不是来自实际表 L20 . 如果你想做到这一点 L20 大多数都可以指定为公共表表达式。

相关问题