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

Откуда: Moscow
Сообщений: 907
Подскажите пожалуйста, как можно переписать вложенный запрос по эффективней.

select *
from ...
where OrgId in (
  SELECT DISTINCT s.OrgId
  from
  (
   SELECT [OrgId], [Id], count(*)
   FROM [Goods]
   GROUP by [OrgId], [Id]
   HAVING count(*)>1
  ) s
)


DISTINCT нужно убрать, или наоборот оставить - что будет выгодней ?

И как избавится от подзапроса S ? Нужна группировка, но "where OrgId in" должна получить только один столбец же
21 ноя 14, 19:40    [16887565]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом.  [new]
Добрый Э - Эх
Guest
ProBiotek
как избавится от подзапроса S ?
непонятно, зачем ты вообще в него завернул IN-подзапрос. Ибо твоя форма записи эквивалентна такому:
select *
from ...
where OrgId in (
  SELECT s.OrgId
   FROM [Goods]
   GROUP by [OrgId], [Id]
   HAVING count(*)>1
)

DISTINCT в IN-подзапросе можно не писать.
21 ноя 14, 19:52    [16887605]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом.  [new]
Добрый Э - Эх
Guest
ProBiotek
Подскажите пожалуйста, как можно переписать вложенный запрос по эффективней.
Только если переделать на JOIN:
select t.*
from () t
join (
  SELECT DISTINCT s.OrgId
   FROM [Goods]
   GROUP by [OrgId], [Id]
   HAVING count(*)>1
)  v
on v.OrgId = t. OrgId

а тут дистинкт уже как раз таки нужен, чтобы не задублировать строки из "внешней" таблицы
21 ноя 14, 19:55    [16887613]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом.  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
я бы еще вот так допилил
select *
from ... tab ...
jion (
  SELECT s.OrgId
   FROM [Goods]
   GROUP by [OrgId], [Id]
   HAVING count(*)>1
)q on q.OrgId=tab.OrgId
не факт что лучше но часто быстрее работает
21 ноя 14, 19:56    [16887616]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом.  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
Спасибо за помощь. Буду мозговать и набираться мудрости :)
21 ноя 14, 19:57    [16887620]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом.  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
Внезапно.
а операции MINUS что ли нет ???
21 ноя 14, 20:12    [16887670]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом.  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
У меня есть таблица где несколько сотен тысяч записей.
Нужно выбрать все элементы, ID которых нет в наборе данных.

Как это сделать без MINUS ?
21 ноя 14, 20:14    [16887682]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом.  [new]
o-o
Guest
ProBiotek,

выборку того, чего где-то нет, обычно осуществляют через
where not exists
21 ноя 14, 21:00    [16887888]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом.  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
MINUS - это EXCEPT. Если это поможет. Но пока есть реализация только со встроенным DISTINCT.
22 ноя 14, 09:41    [16889042]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить