Разделить результат запроса пополам в TSQL (получить 2 набора результатов / таблицы) - PullRequest
0 голосов
/ 19 марта 2010

У меня есть запрос, который возвращает большое количество тяжелых строк.

Когда я преобразую эти строки в список CustomObject, у меня появляется большой пик памяти, и это преобразование выполняется с помощью пользовательской структуры dotnet, которую я не могу изменить.

Мне нужно извлечь меньшее количество строк, чтобы выполнить «преобразование» за два прохода, а затем избежать пика памяти.

Как я могу разделить результат запроса пополам? Мне нужно сделать это в слое БД. Я хочу сделать «Top count (*) / 2», но как получить вторую половину?

Спасибо!

Ответы [ 4 ]

2 голосов
/ 19 марта 2010

Если в таблице есть поле идентификатора, сначала выберите четные идентификаторы, а затем нечетные.

select * from Table where Id % 2 = 0

select * from Table where Id % 2 = 1

В каждом наборе должно быть примерно 50% строк.

1 голос
/ 19 марта 2010

Вот еще один способ сделать это из (http://www.tek -tips.com / viewthread.cfm? Qid = 1280248 & page = 5 ). Я думаю, что это более эффективно:

Declare @Rows Int
Declare @TopRows Int
Declare @BottomRows Int

Select @Rows = Count(*) From TableName

If @Rows % 2 = 1
  Begin    
    Set @TopRows = @Rows / 2
    Set @BottomRows = @TopRows + 1
  End
Else
  Begin
    Set @TopRows = @Rows / 2
    Set @BottomRows = @TopRows
  End    

Set RowCount @TopRows

Select * From TableName Order By DisplayOrder

Set RowCount @BottomRows

Select * From TableNameOrder By DisplayOrderDESC

--- старый ответ ниже ---
Это вызов хранимой процедуры или динамический sql? Вы можете использовать временные таблицы?

если так, что-то вроде этого будет работать

select row_number() OVER(order by yourorderfield) as rowNumber, * 
  INTO #tmp
FROM dbo.yourtable

declare @rowCount int
SELECT @rowCount = count(1) from #tmp

SELECT * from #tmp where rowNumber <= @rowCount / 2

SELECT * from #tmp where rowNumber > @rowCount / 2

DROP TABLE #tmp
0 голосов
/ 20 марта 2010

Я не думаю, что вы должны делать это в SQL, если только у вас не будет возможности иметь одну и ту же запись 2 раза.

Я бы сделал это на «программном» языке программирования, а не на SQL. Java, .NET, C ++ и т.д ...

0 голосов
/ 19 марта 2010
SELECT TOP 50 PERCENT WITH TIES ... ORDER BY SomeThing

тогда

SELECT TOP 50 PERCENT ... ORDER BY SomeThing DESC

Однако, если вы сначала не сделаете снимок данных, строка в середине может проскользнуть или быть обработана дважды

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...