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

Откуда:
Сообщений: 3947
Что-то тяжело думаеться, а необходимо )))

Есть таблички

Объекты
----------------
OID


Объект-Категории
------------------
OID
CategoryID


КатегорииОбъектов
--------------------
CategoryID


нужно вывести все объекты содержащие в категориях @CategoryID
или вывести все объекты если @CategoryID is NULL

select
  "Объекты".ID
from
  "Объекты" o
  inner join "Объект-Категории" oc on oc.OID = o.OID
  inner join "КатегорииОбъектов" co on co.CategoryID = oc.CategoryID
where
  co.CategoryID = @CategoryID or @CategoryID is Null

у меня выводятся объекты по нескольку раз одни и теже (выводятся те у которых есть несколько категорий), а необходимо только по одному разу
7 ноя 09, 01:11    [7895533]     Ответить | Цитировать Сообщить модератору
 Re: Не могу составить запрос в час ночи!!!  [new]
если не думая
Guest
select distinct
  "Объекты".ID
from
  "Объекты" o
  inner join "Объект-Категории" oc on oc.OID = o.OID
  inner join "КатегорииОбъектов" co on co.CategoryID = oc.CategoryID
where
  co.CategoryID = @CategoryID or @CategoryID is Null
7 ноя 09, 01:16    [7895553]     Ответить | Цитировать Сообщить модератору
 Re: Не могу составить запрос в час ночи!!!  [new]
sp
Member

Откуда:
Сообщений: 3947
если не думая
select distinct
  "Объекты".ID
from
  "Объекты" o
  inner join "Объект-Категории" oc on oc.OID = o.OID
  inner join "КатегорииОбъектов" co on co.CategoryID = oc.CategoryID
where
  co.CategoryID = @CategoryID or @CategoryID is Null


да про distinct я знаю - но это просто неграмотно, просто нужно чето в запросе подшаманить с соединениями таблиц, а что пока не соображу
7 ноя 09, 01:20    [7895575]     Ответить | Цитировать Сообщить модератору
 Re: Не могу составить запрос в час ночи!!!  [new]
призадумавшись
Guest
select distinct
  oc.ID
from
  "Объект-Категории" oc
  inner join "КатегорииОбъектов" co on co.CategoryID = oc.CategoryID
where
  co.CategoryID = @CategoryID or @CategoryID is Null
7 ноя 09, 01:27    [7895606]     Ответить | Цитировать Сообщить модератору
 Re: Не могу составить запрос в час ночи!!!  [new]
Ozzy-Osbourne
Member

Откуда: Balashikha
Сообщений: 139
Попробуйте так (без distinct'а):
declare @obj table (oid int)
declare @o2c table(oid int, cat int)
declare @cid int

insert @obj select 1 union all select 2 union all select 3 union all select 4 union all select 5
insert @o2c select 2,20 union all select 3,20 union all select 5,22
insert @o2c select 2,23 union all select 2,24 union all select 5,25
insert @o2c select 1,20 union all select 1,21 union all select 1,25

set @cid=20

select o.oid --,c=count(oc.oid)
from @obj o
left join @o2c oc on o.oid=oc.oid and isnull(oc.cat,-1)=isnull(@cid,-1)
group by o.oid
having count(oc.oid)=isnull(sign(@cid),0)
В тестовых данных категория 20 занесена для объектов с oid=2, 3 и 1. Проверьте, что будет в итоге для переменной @cid = 20 и затем для null.
7 ноя 09, 01:35    [7895637]     Ответить | Цитировать Сообщить модератору
 Re: Не могу составить запрос в час ночи!!!  [new]
Ozzy-Osbourne
Member

Откуда: Balashikha
Сообщений: 139
PS. Впрочем, всё равно сортировка в неявном виде присутствует, ибо есть group by :-)
7 ноя 09, 01:36    [7895640]     Ответить | Цитировать Сообщить модератору
 Re: Не могу составить запрос в час ночи!!!  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
where @CategoryID is Null or exists(select .....)
а лучше разбить на 2 варианта - для первого и для второго случая.

-------------------------
There’s no silver bullet!
7 ноя 09, 01:39    [7895653]     Ответить | Цитировать Сообщить модератору
 Re: Не могу составить запрос в час ночи!!!  [new]
sp
Member

Откуда:
Сообщений: 3947
Ozzy-Osbourne
PS. Впрочем, всё равно сортировка в неявном виде присутствует, ибо есть group by :-)


я вот смоьрю в сторону типов соединений, но пока голова не соображает (( сильно много пришлось думать сегодня, думал может у кого посвежее и не прийдется ждать до завтра пока высплюсь
7 ноя 09, 01:41    [7895664]     Ответить | Цитировать Сообщить модератору
 Re: Не могу составить запрос в час ночи!!!  [new]
sp
Member

Откуда:
Сообщений: 3947
тут еще одна проблема выявилась - если у объекта нет категории - он не выбирается! (((
7 ноя 09, 02:16    [7895774]     Ответить | Цитировать Сообщить модератору
 Re: Не могу составить запрос в час ночи!!!  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
sp,

а вы попробуйте сформулировать задачу не в терминах SQL, а в виде предложения на русском языке.
7 ноя 09, 02:18    [7895777]     Ответить | Цитировать Сообщить модератору
 Re: Не могу составить запрос в час ночи!!!  [new]
sp
Member

Откуда:
Сообщений: 3947
locky
sp,

а вы попробуйте сформулировать задачу не в терминах SQL, а в виде предложения на русском языке.


мне необходимо выбрать все объекты, которые содержат указанную категорию - если @CategoryID не NULL, и все объекты - если @CategoryID = NULL
7 ноя 09, 02:21    [7895782]     Ответить | Цитировать Сообщить модератору
 Re: Не могу составить запрос в час ночи!!!  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
sp,

ну вот и прекрасно
в лоб пишем

select *
from Объекты o
where @CategoryId is null or exists(select * from Объект-Категории oi where oi.oid = o.oid and oi.CategoryID=@CategoryID)
7 ноя 09, 02:22    [7895785]     Ответить | Цитировать Сообщить модератору
 Re: Не могу составить запрос в час ночи!!!  [new]
sp
Member

Откуда:
Сообщений: 3947
locky
sp,

ну вот и прекрасно
в лоб пишем

select *
from Объекты o
where @CategoryId is null or exists(select * from Объект-Категории oi where oi.oid = o.oid and oi.CategoryID=@CategoryID)


спасибо большое за помощь!
7 ноя 09, 02:33    [7895810]     Ответить | Цитировать Сообщить модератору
 Re: Не могу составить запрос в час ночи!!!  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Только я бы на вашем месте разбил запрос на две ветки - когда категория указана и когда не указана.

-------------------------
There’s no silver bullet!
7 ноя 09, 02:41    [7895824]     Ответить | Цитировать Сообщить модератору
 Re: Не могу составить запрос в час ночи!!!  [new]
sp
Member

Откуда:
Сообщений: 3947
locky
Только я бы на вашем месте разбил запрос на две ветки - когда категория указана и когда не указана.

-------------------------
There’s no silver bullet!


почему?
7 ноя 09, 02:52    [7895835]     Ответить | Цитировать Сообщить модератору
 Re: Не могу составить запрос в час ночи!!!  [new]
iljy
Member

Откуда:
Сообщений: 8711
sp
locky
Только я бы на вашем месте разбил запрос на две ветки - когда категория указана и когда не указана.

-------------------------
There’s no silver bullet!


почему?


а вы разбейте и посмотрите на планы - много интересного увидите.
7 ноя 09, 11:35    [7896120]     Ответить | Цитировать Сообщить модератору
 Re: Не могу составить запрос в час ночи!!!  [new]
sp
Member

Откуда:
Сообщений: 3947
iljy
sp
locky
Только я бы на вашем месте разбил запрос на две ветки - когда категория указана и когда не указана.

-------------------------
There’s no silver bullet!


почему?


а вы разбейте и посмотрите на планы - много интересного увидите.


дык а ежели я подсказку ставлю в запрос!? )
OPTION (RECOMPILE)
7 ноя 09, 14:14    [7896431]     Ответить | Цитировать Сообщить модератору
 Re: Не могу составить запрос в час ночи!!!  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
sp

дык а ежели я подсказку ставлю в запрос!? )
OPTION (RECOMPILE)

Для 2008 может помочь.
для 2005 и ранее - нет.
7 ноя 09, 14:34    [7896457]     Ответить | Цитировать Сообщить модератору
 Re: Не могу составить запрос в час ночи!!!  [new]
sp
Member

Откуда:
Сообщений: 3947
locky
sp

дык а ежели я подсказку ставлю в запрос!? )
OPTION (RECOMPILE)

Для 2008 может помочь.
для 2005 и ранее - нет.


у нас 2008 )
7 ноя 09, 20:46    [7897083]     Ответить | Цитировать Сообщить модератору
 Re: Не могу составить запрос в час ночи!!!  [new]
iljy
Member

Откуда:
Сообщений: 8711
sp
locky
sp

дык а ежели я подсказку ставлю в запрос!? )
OPTION (RECOMPILE)

Для 2008 может помочь.
для 2005 и ранее - нет.


у нас 2008 )

даже на 2008 не вполне помогает. Проверьте сами, это не так сложно - сравнить планы 3 запросов
7 ноя 09, 20:59    [7897120]     Ответить | Цитировать Сообщить модератору
 Re: Не могу составить запрос в час ночи!!!  [new]
sp
Member

Откуда:
Сообщений: 3947
iljy
sp
locky
sp

дык а ежели я подсказку ставлю в запрос!? )
OPTION (RECOMPILE)

Для 2008 может помочь.
для 2005 и ранее - нет.


у нас 2008 )

даже на 2008 не вполне помогает. Проверьте сами, это не так сложно - сравнить планы 3 запросов


спасибо, проверю
8 ноя 09, 18:47    [7898473]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить