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

Откуда: Россия
Сообщений: 579
таблицы
region(region_id int, region_name varchar)
doc(doc_id, int, doc_name varchar)
docregion(doc_id int, region_id int)
документ соответвенно может принадлежать нескольким регионам, например областям, субъектам РФ
а может не быть связки и тогда документ принадлежить всей РФ.

задача
мне необходимо получить набор данных - список новостей в одном флаконе
doc_id, doc_name, region_id

Условия
Мне нужно выводить данные так - топ 5 новостей по стране или топ 5 по региону.
Хочецца получить все новости в один источник и потом оттудава их брать.
тоесть примерно

SELECT top 5 Doc_ID FROM DocRegion UNION 
SELECT top 5 Doc_ID  FROM DocRegion WHERE Region_ID = 1 UNION 
SELECT top 5 Doc_ID  FROM DocRegion WHERE Region_ID = 2 UNION 
SELECT top 5 Doc_ID  FROM DocRegion WHERE Region_ID = 3 UNION 
SELECT top 5 Doc_ID  FROM DocRegion WHERE Region_ID = 4 UNION  
..............
SELECT top 5 Doc_ID  FROM DocRegion WHERE Region_ID = N

timda.ru

вот как это реализовать одним запросом - вопрос ;-)
26 мар 05, 17:40    [1417581]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37077
select
  a.doc_id,
  d.doc_name,
  a.region_id,
  (
    select count(*)
    from docregion b
    where a.region_id = b.region_id and b.doc_id <= a.doc_id
  ) cnt
from docregion a
inner join doc d on d.id = a.doc_id
where cnt < 6
26 мар 05, 17:55    [1417592]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
timda
Member

Откуда: Россия
Сообщений: 579
Подскажите пож-та, зачем это сравнение ?

and b.doc_id <= t1.doc_id



timda.ru
26 мар 05, 18:09    [1417609]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37077
timda
Подскажите пож-та, зачем это сравнение ?

and b.doc_id <= t1.doc_id



timda.ru

Для нумерации документов внутри региона.
26 мар 05, 18:10    [1417610]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
timda
Member

Откуда: Россия
Сообщений: 579
просто и без строки "and b.doc_id <= a.doc_id", отработает ... разве нет ?

нумерация документов - не понимаю ;-)

в любом случае спасиб

timda.ru
26 мар 05, 18:14    [1417616]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37077
автор
просто и без строки "and b.doc_id <= a.doc_id", отработает ... разве нет ?

На самом деле довольно просто проверить, да и результат скажет сам за себя, не так ли?
автор
нумерация документов - не понимаю ;-)

Пять документов по региону - это документы, имеющие номера с первого по пятый (например). Осталось только пронумеровать документы в пределах региона.
26 мар 05, 18:17    [1417619]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
timda
Member

Откуда: Россия
Сообщений: 579
Не понимаю чо физически MSSQL будит делать ...

значит возьметь все DOC_ID отсюда docregion b где регион такой то
допустим это будет (1, 2, 3, 4, 5, 6, 7) - семь документов

далее посмотрит где в этом списке DOC_ID будут меньше текущего документа или равны ... и посчитает тама кол-во ...

допустим он идет по док_ид=4 в таблице docregion a
тоесть в том случае каунт должен быть равен 4, а на самом деле он равен 7 ;-)

запутался я совсем ;-)


ЗЫ: а что будет с таким запросом на порядке документов около 100.000
регионов у меня 10 штук, тоесть COUNT(DocRegion) около 200.000

timda.ru
26 мар 05, 18:29    [1417631]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37077
автор
ЗЫ: а что будет с таким запросом на порядке документов около 100.000
регионов у меня 10 штук, тоесть COUNT(DocRegion) около 200.000

На оптимальность не претендую. Потестите, посмотрите.
автор
Не понимаю чо физически MSSQL будит делать ...

То, что MSSQL делает физически, он честно показывает в плане выполнения.

А если брать логически, то для каждого докумета будет выведено количество документов это-го же региона, имеющего doc_id (который, к слову, должен быть уникальный в пределах региона) равный или меньший текущего.
З.Ы. Вот еще ссылка на данную тему.
26 мар 05, 18:34    [1417635]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
timda
Member

Откуда: Россия
Сообщений: 579
та я не пойму зачем же тама порядковый индекс - щас голова начнет ломацца ;-)

в чом разница - такой запрос тож пральный ;-)
автор
select t1.doc_id, COUNT(t1.Region_ID) as cnt
from ndocRegion t1, ndoc t2
WHERE t2.doc_id = t1.doc_id
GROUP BY t1.doc_id


и кстати в силу того что документ может быть не привязан ни к чему - надо лефт джойн еще делать ;-)

timda.ru
26 мар 05, 18:46    [1417643]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
timda
Member

Откуда: Россия
Сообщений: 579
не вру, так неправильно ;-)
timda.ru
26 мар 05, 18:51    [1417650]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
timda
Member

Откуда: Россия
Сообщений: 579
не работает "where cnt < 6"
хевинг тоже не помогает ...
как ограничить подскажите пож-та


timda.ru
26 мар 05, 18:58    [1417653]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37077
timda
не работает "where cnt < 6"
хевинг тоже не помогает ...
как ограничить подскажите пож-та


timda.ru

Что значит - не работает?
P.S. Давайте тогда скрипт с данными.
26 мар 05, 19:05    [1417660]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
timda
Member

Откуда: Россия
Сообщений: 579
скрипт с данными как дам - встроенной чтуки в MSSQL нету )))

вы на любой своей табличке попробуйте сделать так
SELECT Doc_ID, (1) as cnt
FROM nDoc t1
WHERE cnt < 6
скажет
Server: Msg 207, Level 16, State 3, Line 1
Invalid column name 'cnt'.


--------
я наверно сделаю на Dynamic SQL
скорее всего просто так быстрее будет - боюся я за производительность ;-)

timda.ru
26 мар 05, 19:10    [1417666]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
timda
Member

Откуда: Россия
Сообщений: 579
спасибо

timda.ru
26 мар 05, 19:13    [1417671]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
Glory
Member

Откуда:
Сообщений: 104760
я наверно сделаю на Dynamic SQL
скорее всего просто так быстрее будет - боюся я за производительность ;-)

Синтаксис нало учить по руководству а не методом тыка
26 мар 05, 19:13    [1417672]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
timda
Member

Откуда: Россия
Сообщений: 579
Глори, извините, но при всем уважении, Вы хамити ....

timda.ru
26 мар 05, 19:19    [1417682]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
Glory
Member

Откуда:
Сообщений: 104760
timda
Глори, извините, но при всем уважении, Вы хамити ....

timda.ru

Да что вы говорите ? А вы про каждую ошибку в своих запросах намерены спрашивать в форуме ? Или может вначале посмотрите что пишется в BOL об этой ошибке ?
26 мар 05, 19:24    [1417687]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37077
timda
скрипт с данными как дам - встроенной чтуки в MSSQL нету )))

вы на любой своей табличке попробуйте сделать так
SELECT Doc_ID, (1) as cnt
FROM nDoc t1
WHERE cnt < 6
скажет
Server: Msg 207, Level 16, State 3, Line 1
Invalid column name 'cnt'.


--------
я наверно сделаю на Dynamic SQL
скорее всего просто так быстрее будет - боюся я за производительность ;-)

timda.ru

select *
from (
  SELECT Doc_ID, (1) as cnt
  FROM nDoc t1
) a
WHERE cnt < 6
26 мар 05, 20:29    [1417724]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить