2014-11-25 4 views
0
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 

Я написал курсор для получения этого вывода (я вставил эти данные случайных строк для теста). Но если в производительности курсоров курсора больше, чем 1k, то производительность становится настолько медленной. Мне нужно для записи запроса чередуйте этот курсор.Альтернатива для этого курсора

Это мой курсор:

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; 

Когда я сортировать таблицу по названию или категории, каждые языки этого продукта следует рассматривать в subbuttom и упорядочены по LANGID (как это: http://i.imgur.com/QBffjBX.png).

Я не нашел пример, похожий на мою проблему. Пожалуйста, помогите.

+0

Что происходит, когда вы используете более 10000 записей? Разрешаете ли вы дублировать идентификаторы? –

+0

Это было бы намного проще, если бы вы могли превратиться в расходуемый набор данных, чтобы мы могли помочь вам с кодом. sqlfiddle.com - отличное место для начала. Кроме того, у вашего окончательного выбора есть заказ, но у вас нет способа узнать, какой заказ они действительно вернут. Вы действительно должны использовать что-то в наборе данных для заказа. Я заинтригован интересным расчетом для смещения. Это выглядит очень странно для меня. –

+0

@KevinCook после запроса 1000 записей gettin медленнее, просто it.It не дублирует идентификаторы. –

ответ

0

Я нашел ответ, если кто-то интересуется.

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 
Смежные вопросы