Sql server 此光标的替代项
我写了一个游标来获取这个输出(我已经插入了随机字符串数据进行测试)。但是如果表中有超过1k行,游标的性能会变得非常慢。我需要用这个游标来编写查询 这是我的光标: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
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