Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Разбивка выборки(Paging) по сущностям, информация о которых в хранится в 2х таблицах  [new]
Aristokrat
Member

Откуда:
Сообщений: 12
Здравствуйте! Сразу приведу наглядное описание своего вопроса (пример вымышленный) Есть таблицы
смс:
номеринфо1

Звонки:
номеринфо2

В них информация о звонках и смс. В них один номер(сущность) может быть несколько раз, а может и не быть вовсе.
Клиентская поисковая форма по запросу (+7903%) должна выдать имеющуюся информацию по удовлетворяющим поиску номерам, с разбивкой по 100 номеров за раз.

Для этого я группирую из обоих таблиц все удовлетворяющие поиску номера, разбиваю результат на страницы, и уже на необходимые 100 номеров джойню имеющуюся информацию из обоих таблиц. Получается говнокод. И больше всего волнует в нем , что приходится 2жды делать выборку этих самых 100 сущностей.

select * from номера where номер in (
select номер from (
 select ROW_NUMBER() OVER(ORDER BY номер) rownum ,  * from (
	select номер from звонки
	union  
	select номер from смс
) t1 
) t2    where  rownum>0 and  rownum<100
)

union all 

select * from смс where номер in (
select номер from (
 select ROW_NUMBER() OVER(ORDER BY номер) rownum ,  * from (
	select номер from звонки
	union  
	select номер from смс
) t1 
) t2    where  rownum>0 and  rownum<100
)

Хотелось бы обойтись без хранимых процедур, используя только сквозные запросы. Желательно - только один :) Подскажите пожалуйста куда копать.
20 ноя 11, 00:19    [11626419]     Ответить | Цитировать Сообщить модератору
 Re: Разбивка выборки(Paging) по сущностям, информация о которых в хранится в 2х таблицах  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
Хотите красивый код - CTE

Но рекомендую рассмотреть также вариант с закидыванием этих 100 записей во временную таблицу
Возможно, этот вариант окажется экономичнее
20 ноя 11, 00:33    [11626447]     Ответить | Цитировать Сообщить модератору
 Re: Разбивка выборки(Paging) по сущностям, информация о которых в хранится в 2х таблицах  [new]
Aristokrat
Member

Откуда:
Сообщений: 12
Паганель,

Благодарю! Обобщеные Табличные Выражения (CTE) - это то, что нужно.
20 ноя 11, 02:26    [11626649]     Ответить | Цитировать Сообщить модератору
 Re: Разбивка выборки(Paging) по сущностям, информация о которых в хранится в 2х таблицах  [new]
aleks2
Guest
Aristokrat
Паганель,

Благодарю! Обобщеные Табличные Выражения (CTE) - это то, что нужно.


Говнокод, переписанный в CTE, остается говнокодом.
select *
FROM
(
   select ROW_NUMBER() OVER(ORDER BY номер) rownum, * from (
	select номер, [поля то перечисли, не ленись] from звонки
	union ALL 
	select номер, [поля то перечисли, не ленись] from смс
   ) t1 
) t2
where  rownum>0 and  rownum<100

Зачем тут CTE?

ЗЫ. Хотя это все одно - говнокод. Ибо грузит сервант без необходимости.
20 ноя 11, 10:42    [11626835]     Ответить | Цитировать Сообщить модератору
 Re: Разбивка выборки(Paging) по сущностям, информация о которых в хранится в 2х таблицах  [new]
aleks2
Guest
Пардон, забыл ROW_NUMBER() на DENSE_RANK() заменить.
20 ноя 11, 10:45    [11626842]     Ответить | Цитировать Сообщить модератору
 Re: Разбивка выборки(Paging) по сущностям, информация о которых в хранится в 2х таблицах  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
Скажу честно, осилить запрос автора я не смог из-за скобок и форматирования
(заметил только, что у него там не 2 а 3 таблицы участвуют)

поэтому отвечал я на словесное описание проблемы
20 ноя 11, 10:48    [11626844]     Ответить | Цитировать Сообщить модератору
 Re: Разбивка выборки(Paging) по сущностям, информация о которых в хранится в 2х таблицах  [new]
Aristokrat
Member

Откуда:
Сообщений: 12
Alex,
Спасибо за замечания. DENSE_RANK() я заменю позже, как осилю что это. Но в целом, что не так с запросом для CTE?
Запрос, который вы подправили собирает 100 ключевых полей из 2 таблиц, на которые в последующем буду джойнить эти же 2 таблицы. Поэтому там именно Union без all, и не приведен список полей. Конечно, там будет WHERE часть, которую я опустил.
select *
FROM
(
   select ROW_NUMBER() OVER(ORDER BY номер) rownum, * from (
	select номер from звонки Where <условия поиска>
	union  
	select номер from смс Where <условия поиска>
   ) t1 
) t2
where  rownum>@start and  rownum<@end

Я реализовал единственный пришедший в голову способ разбиения на страницы по сущностям. Буду признателен за подсказку как это все сделать по-уму, сервант и так старый и тормознутый.
20 ноя 11, 13:45    [11627125]     Ответить | Цитировать Сообщить модератору
 Re: Разбивка выборки(Paging) по сущностям, информация о которых в хранится в 2х таблицах  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
Возможно, автор просто еще не ознакомился с замечательной статьей "Постраничная выборка"

(у мну щас этим вообще занимается Linq2Sql, а я задумываюсь лишь над гламурностью кнопочек... да здравствует вээээб:)
20 ноя 11, 20:57    [11628323]     Ответить | Цитировать Сообщить модератору
 Re: Разбивка выборки(Paging) по сущностям, информация о которых в хранится в 2х таблицах  [new]
Aristokrat
Member

Откуда:
Сообщений: 12
Паганель,

Автор ознакомился с замечательной статьей Постраничная выборка более подробно, затем с Сравнение производительности, прикинул трудозатраты*коэффициент лени и решил пересмотреть необходимость разбивания результатов поиска на страницы.
Ограничился простым TOP 100 результатов описанного выше CTE и сообщением "Результатов слишком много, показаны только первые 100".
Всем спасибо за содействие :)
21 ноя 11, 11:14    [11630010]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить