Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 此光标的替代项_Sql Server_Group By_Sql Order By - Fatal编程技术网

Sql server 此光标的替代项

Sql server 此光标的替代项,sql-server,group-by,sql-order-by,Sql Server,Group By,Sql Order By,我写了一个游标来获取这个输出(我已经插入了随机字符串数据进行测试)。但是如果表中有超过1k行,游标的性能会变得非常慢。我需要用这个游标来编写查询 这是我的光标: Id groupId LangId Title Category ------ --------- --------- ------------- ----------- 4230 4230 1 aaamrmtwna srhrtie

我写了一个游标来获取这个输出(我已经插入了随机字符串数据进行测试)。但是如果表中有超过1k行,游标的性能会变得非常慢。我需要用这个游标来编写查询

这是我的光标:

  Id       groupId     LangId     Title         Category
------    --------- ---------  -------------  -----------
4230        4230        1       aaamrmtwna     srhrtiewuv
14230       4230        2       uphliibxil     ppanvtqwht
24230       4230        3       neutnlvgkt     xbhwwyjqnm
6023        6023        1       aacnjohrjk     ehmjptsgxd
16023       6023        2       mejrzfhgjv     lhieeslqgf
26023       6023        3       pibswsvfxh     pzzhgjtbyt
3338        3338        1       aaeidhaivc     pxbolmwjan
13338       3338        2       lsbeyvtrch     pdtyrcwkdd
23338       3338        3       huewmezblx     kpjzpfryki
5573        5573        1       aafqhvgltp     xzwmguqfro
15573       5573        2       clzywmldud     hdylrqtcka
25573       5573        3       rwkdahwpdq     syhysvkftx
9896        9896        1       aaiaxqdwho     mxdgtdaeqx
19896       9896        2       onufsjeaal     cjrsotvbqt
29896       9896        3       fowufxxujk     xztkjbctru
9040        9040        1       aajjamlqkf     wattqxerjh
19040       9040        2       nrkdzgourq     rmckjjpvfu
29040       9040        3       winkynkdkf     zhfmkqsyvc
5518        5518        1       aamdwlwwgl     kdzsxuzfdp
15518       5518        2       byzzhqqfsr     cdmxmcxyof
25518       5518        3       ylkffbmief     qildnvyqhi
5043        5043        1       aamqnboinl     awtmdhbiuq
15043       5043        2       nachemovnv     rdzlbxqkdv
25043       5043        3       twxyozpzra     hskmwnsbjc
501         501         1       aansttgfjk     bmirdqmpgb
当我为标题或类别对表格进行排序时,该产品的每种语言都应显示在子按钮中,并按langId排序。(如下所示:)


我还没有找到与我的问题类似的例子。请帮助。

如果有人感兴趣,我已经找到了答案

 DECLARE @Id int
 DECLARE @groupId int
 DECLARE @LangId int
 DECLARE @Title nvarchar(50)
 DECLARE @Category nvarchar(50) 
 DECLARE @i int
 DECLARE @Result TABLE
 (
 Id int,
 groupId int,
 LangId int,
 Title nvarchar(50),
 Category nvarchar(50) 
 )
 DECLARE csr_group CURSOR FORWARD_ONLY FOR

 SELECT TOP 100 * FROM SortThis order by LangID, Title

 OPEN csr_group

 FETCH NEXT FROM csr_group INTO @Id , @groupId , @LangId , @Title , @Category 
 WHILE @@FETCH_STATUS =0         
    BEGIN 
    set @i = (select Id from @Result where Id = @Id)
        if @i is null
        begin
            INSERT INTO @Result
               (
                [ID]
               ,[GroupId]
               ,[LangId]
               ,[Title]
               ,[Category]
               )
               Select * from SortThis where GroupId = @groupId 
        FETCH NEXT FROM csr_group INTO @Id , @groupId , @LangId , @Title , @Category 
        end
    END 
CLOSE csr_group
DEALLOCATE csr_group

select * from @Result 
order by (Select 0)
OFFSET ((1 - 1) * 25) ROWS 
FETCH NEXT 25 ROWS ONLY;

当您运行超过10000条记录时会发生什么?您允许重复ID吗?如果您可以将其转换为可消费的数据集,这样我们就可以帮助您编写代码,这会容易得多。sqlfiddle.com是一个很好的起点。此外,您的最终选择有一个订单,但您无法知道他们实际返回的订单。您确实应该使用数据集中的某些内容进行排序。我对偏移量的有趣计算很感兴趣。这在我看来很奇怪。@KevinCook在1000条记录之后查询速度变慢了。它不是dublicating id。@SeanLange当我按任何列排序时,我得到的顺序正在改变,而对于分页,我必须给offset一个顺序,所以我这样做了。当然,这可能是一种错误的使用方式。这就是为什么我要搜索正确的查询。偏移量的计算是(pageNumber-1)*pageSize。如果您能帮助我,我将不胜感激。因此,当您最终获得14230的groupid并生成14230的第一条记录时(因为您没有向id系列中的第一条记录添加任何内容),您不会看到该代码将来将如何生成重复的id吗?
SELECT
Id, GroupId, LangId, Title, Category FROM
SortThis s2 Order BY (

SELECT TOP 1 s1.Category FROM SortThis s1 WHERE s1.LangId=(
SELECT MIN(LangId) FROM SortThis s3 WHERE s1.GroupId=s3.GroupId
) AND s1.GroupId=s2.GroupId
) , LangId

OFFSET (1-1) * 25 ROWS
FETCH NEXT 25 ROWS ONLY