【问题标题】:SQL query: How to only display certain rows when using aliasing?SQL查询:使用别名时如何只显示某些行?
【发布时间】:2021-03-15 08:03:41
【问题描述】:

我试图仅显示 rownum 介于 0 和 24 之间的行。这将是动态的,并且范围将根据用户所在的页面而改变。由于某种原因,下面的查询永远执行并且永远不会返回结果。如果我删除这个:

WHERE 
    rownum >= 0 AND rownum < 24 
ORDER BY 
    rownum; 

查询然后毫无问题地执行。

我怎样才能修复这个查询,让它做我想做的事?为什么这个不起作用?:

WITH cs AS 
( 
    SELECT 
        ROW_NUMBER() OVER (ORDER BY [RCA].[I_UID]) AS rownum, 
        [RCA].[I_UID], 
        [RCA].[I_TYPE_UID], 
        [RCA].[I_I_C], 
        [RCA].[L_D], 
        [RCA].[SOME_DATE], 
        [RCA].[ANOTHER_DATE], 
        [RCA].[ANOTHER_DATED], 
        [RCA].[L_ED_DATE], 
        [RCA].[L_ED_USER_UID], 
        [RCA].[PNT_UID], 
        [RCA].[FA_UID], 
        [RCA].[D_LE], 
        [RCA].[DIGITAL_A], 
        [RCA].[LOK], 
        [RCA].[KILP], 
        [RCA].[LKP], 
        [RCA].[BLT], 
        [RCA].[LAT], 
        [RCA].[JUT], 
        [RCA].[S_UID], 
        [S_A].[FAT_UID], 
        [S_A].[RD_UID], 
        [S_A].[S_CODE], 
        [S_A].[S_NAME], 
        [S_A].[S_TYPE_UID], 
        [S_A].[S_LENGTH], 
        [S_A].[CUP_LIMIT], 
        [S_A].[S_N_C], 
        [S_A].[S_N_D_JCT_TYPE_UID], 
        [S_A].[S_N_D_NAME], 
        [S_A].[ENC], 
        [S_A].[ENJT_UID], 
        [S_A].[ENT_NAME], 
        [S_A].[N_UID], 
        [S_A].[R_UID], 
        [S_A].[A_UID], 
        [S_A].[D_UID], 
        [S_A].[DI_UID], 
        [S_A].[SU_UID], 
        [S_A].[BS_T], 
        [S_A].[CLU_UID], 
        [S_A].[MH_UID], 
        [S_A].[EN_UID], 
        [S_A].[OWN_UID], 
        [S_A].[AG_UID], 
        [S_A].[DPT], 
        [S_A].[NPI], 
        [S_A].[R_W_C], 
        [S_A].[S_L_UID], 
        [S_A].[S_LF_T_CODE], 
        [S_A].[FT_I_UID], 
        [S_A].[F_O_UID], 
        [S_A].[DRN_C], 
        [S_A].[SUY_UID], 
        [S_A].[S_L_CS], 
        [S_A].[SUY], 
        [S_A].[MAX], 
        [S_A].[STRA_NO], 
        [S_A].[NOP], 
        [S_A].[CWXSP], 
        [S_A].[OFFCWXSP], 
        [S_A].[UK_M_HR_UID], 
        [S_A].[FWAY_M_HR_UID], 
        [S_A].[CYCLE_M_HR_UID], 
        [S_A].[UK_R_ROU_UID], 
        [S_A].[UK_R_DOT_CLUIFICATION_UID], 
        [S_A].[L_UID], 
        [S_A].[LOCAL_HR], 
        [S_A].[PG_DATE], 
        [S_A].[LCA_DIS_UID], 
        [S_A].[CWT], 
        [S_A].[LCA_OCC_L_UID], 
        [S_A].[SKL], 
        [S_A].[SKG] 
    FROM 
        RCA 
    LEFT OUTER JOIN 
        S_A ON RCA.S_uid = S_A.S_uid
    WHERE 
        [RCA].[SOME_DATE] <= '02 december 2020'
        AND [RCA].[ANOTHER_DATE] >= '02 december 2020'
        AND [S_A].[SOME_DATE] <= '02 december 2020'
        AND [S_A].[ANOTHER_DATE] >= '02 december 2020'
) 
SELECT *
FROM cs
WHERE 
    rownum >= 0 AND rownum < 24 
ORDER BY 
    rownum; 

更新:

我已经使用 OFFSET / FETCH 更新了我的查询以进行分页。只有当我按降序排序时,查询才会成功执行。将其更改为ORDER BY rownum ASC 时,查询将永远执行而不返回任何结果。这是有效的查询,但是我要求结果按升序排列:

SELECT 
        [RCA].[I_UID], 
        [RCA].[I_TYPE_UID], 
        [RCA].[I_I_C], 
        [RCA].[L_D], 
        [RCA].[SOME_DATE], 
        [RCA].[ANOTHER_DATE], 
        [RCA].[ANOTHER_DATED], 
        [RCA].[L_ED_DATE], 
        [RCA].[L_ED_USER_UID], 
        [RCA].[PNT_UID], 
        [RCA].[FA_UID], 
        [RCA].[D_LE], 
        [RCA].[DIGITAL_A], 
        [RCA].[LOK], 
        [RCA].[KILP], 
        [RCA].[LKP], 
        [RCA].[BLT], 
        [RCA].[LAT], 
        [RCA].[JUT], 
        [RCA].[S_UID], 
        [S_A].[FAT_UID], 
        [S_A].[RD_UID], 
        [S_A].[S_CODE], 
        [S_A].[S_NAME], 
        [S_A].[S_TYPE_UID], 
        [S_A].[S_LENGTH], 
        [S_A].[CUP_LIMIT], 
        [S_A].[S_N_C], 
        [S_A].[S_N_D_JCT_TYPE_UID], 
        [S_A].[S_N_D_NAME], 
        [S_A].[ENC], 
        [S_A].[ENJT_UID], 
        [S_A].[ENT_NAME], 
        [S_A].[N_UID], 
        [S_A].[R_UID], 
        [S_A].[A_UID], 
        [S_A].[D_UID], 
        [S_A].[DI_UID], 
        [S_A].[SU_UID], 
        [S_A].[BS_T], 
        [S_A].[CLU_UID], 
        [S_A].[MH_UID], 
        [S_A].[EN_UID], 
        [S_A].[OWN_UID], 
        [S_A].[AG_UID], 
        [S_A].[DPT], 
        [S_A].[NPI], 
        [S_A].[R_W_C], 
        [S_A].[S_L_UID], 
        [S_A].[S_LF_T_CODE], 
        [S_A].[FT_I_UID], 
        [S_A].[F_O_UID], 
        [S_A].[DRN_C], 
        [S_A].[SUY_UID], 
        [S_A].[S_L_CS], 
        [S_A].[SUY], 
        [S_A].[MAX], 
        [S_A].[STRA_NO], 
        [S_A].[NOP], 
        [S_A].[CWXSP], 
        [S_A].[OFFCWXSP], 
        [S_A].[UK_M_HR_UID], 
        [S_A].[FWAY_M_HR_UID], 
        [S_A].[CYCLE_M_HR_UID], 
        [S_A].[UK_R_ROU_UID], 
        [S_A].[UK_R_DOT_CLUIFICATION_UID], 
        [S_A].[L_UID], 
        [S_A].[LOCAL_HR], 
        [S_A].[PG_DATE], 
        [S_A].[LCA_DIS_UID], 
        [S_A].[CWT], 
        [S_A].[LCA_OCC_L_UID], 
        [S_A].[SKL], 
        [S_A].[SKG] 
    FROM 
        RCA 
    INNER JOIN 
        S_A ON RCA.S_uid = S_A.S_uid
    WHERE 
        [RCA].[SOME_DATE] <= '02 december 2020'
        AND [RCA].[ANOTHER_DATE] >= '02 december 2020'
        AND [S_A].[SOME_DATE] <= '02 december 2020'
        AND [S_A].[ANOTHER_DATE] >= '02 december 2020'

ORDER BY 
    [RCA].[I_UID] DESC

    OFFSET 0 ROWS
    FETCH FIRST 24 ROWS ONLY;

最终工作解决方案:

;WITH cs AS 
( 
    SELECT 
        t.S_UID,
        t.I_UID,
        t.[I_TYPE_UID], 
        t.[I_I_C], 
        t.[L_D], 
        t.[SOME_DATE], 
        t.[ANOTHER_DATE], 
        t.[ANOTHER_DATED], 
        t.[L_ED_DATE], 
        t.[L_ED_USER_UID], 
        t.[PNT_UID], 
        t.[FA_UID], 
        t.[D_LE], 
        t.[DIGITAL_A], 
        t.[LOK], 
        t.[KILP], 
        t.[LKP], 
        t.[BLT], 
        t.[LAT], 
        t.[JUT], 
        S_A.[FAT_UID], 
        S_A.[RD_UID], 
        S_A.[S_CODE], 
        S_A.[S_NAME], 
        S_A.[S_TYPE_UID], 
        S_A.[S_LENGTH], 
        S_A.[CUP_LIMIT], 
        S_A.[S_N_C], 
        S_A.[S_N_D_JCT_TYPE_UID], 
        S_A.[S_N_D_NAME], 
        S_A.[ENC], 
        S_A.[ENJT_UID], 
        S_A.[ENT_NAME], 
        S_A.[N_UID], 
        S_A.[R_UID], 
        S_A.[A_UID], 
        S_A.[D_UID], 
        S_A.[DI_UID], 
        S_A.[SU_UID], 
        S_A.[BS_T], 
        S_A.[CLU_UID], 
        S_A.[MH_UID], 
        S_A.[EN_UID], 
        S_A.[OWN_UID], 
        S_A.[AG_UID], 
        S_A.[DPT], 
        S_A.[NPI], 
        S_A.[R_W_C], 
        S_A.[S_L_UID], 
        S_A.[S_LF_T_CODE], 
        S_A.[FT_I_UID], 
        S_A.[F_O_UID], 
        S_A.[DRN_C], 
        S_A.[SUY_UID], 
        S_A.[S_L_CS], 
        S_A.[SUY], 
        S_A.[MAX], 
        S_A.[STRA_NO], 
        S_A.[NOP], 
        S_A.[CWXSP], 
        S_A.[OFFCWXSP], 
        S_A.[UK_M_HR_UID], 
        S_A.[FWAY_M_HR_UID], 
        S_A.[CYCLE_M_HR_UID], 
        S_A.[UK_R_ROU_UID], 
        S_A.[UK_R_DOT_CLUIFICATION_UID], 
        S_A.[L_UID], 
        S_A.[LOCAL_HR], 
        S_A.[PG_DATE], 
        S_A.[LCA_DIS_UID], 
        S_A.[CWT], 
        S_A.[LCA_OCC_L_UID], 
        S_A.[SKL], 
        S_A.[SKG] 
       
    FROM 
        RCA AS t
    LEFT OUTER JOIN 
        S_A ON t.S_UID = S_A.S_UID
    
    WHERE 
        t.[SOME_DATE] <= '02 december 2020'
        AND t.[ANOTHER_DATE] >= '02 december 2020'

    ORDER BY t.[I_UID]
        OFFSET 24 * 0 ROWS
    FETCH NEXT 24 ROWS ONLY
) 

SELECT *
FROM cs
ORDER BY 
cs.I_UID

【问题讨论】:

  • 这对我有用:dbfiddle.uk/…
  • 奇怪,是一样的。知道什么可能导致上述不起作用吗?如果我删除最终选择的 WHERE 部分,则查询有效
  • 你有多少数据?你不是说不行,你解释说太费时间了?
  • 刚刚超过 72000 行。如果我删除语句的 WHERE 部分,执行大约需要 7 到 11 秒。使用 WHERE 的查询,它不会出错,它只是永远执行(我已经将它放置了 30 分钟,它仍在执行)
  • 经常使用OFFSET/FETCH进行分页。

标签: sql ssms sql-server-2014 row-number


【解决方案1】:

TOP 是你需要的东西吗:

SELECT  top 3 t.id
         , t.age
         , t.name
         , t.surname
         , t2.workplace
FROM test t
left join test2 t2 on t.id = t2.id

这是一个演示:

DEMO

这个怎么样:

SELECT   t.id
         , t.age
         , t.name
         , t.surname
         , t2.workplace
FROM test t
left join test2 t2 on t.id = t2.id
ORDER BY t.id
OFFSET 1 ROWS
FETCH NEXT 1 ROWS ONLY;

DEMO

【讨论】:

  • 谢谢,但用户需要能够使用 ROW_NUMBER() 为每一行指定一个数字,并且 TOP 只会返回顶部记录,因此当用户更改页面时,它将不起作用
  • 嗨@NickyLarson我已经更新了我的答案......也许这会好的......
  • 理论上也应该有效,但由于某种原因,它只有在我使用ORDER BY t.id DESC 运行该查询时才有效。使用ORDER BY t.id ASC 不起作用
  • 嗨@NickyLarson 这是什么意思-使用 ORDER BY t.id ASC 不起作用?你能再解释一下吗?
  • 我已经更新了我的帖子以准确表达我的意思。我在上面发布的更新查询有效,但是如果我将其更改为:ORDER BY rownum ASC,查询将永远执行而不返回任何结果,这是必需的。
猜你喜欢
  • 2012-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-27
  • 2014-12-16
相关资源
最近更新 更多