Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > Сложный запрос


Автор: uranpro 2.7.2008, 15:48
есть таблица v_DublePrice с полями dpMID, dpPID, dpPriceID, dpPrice

MID- модель, PID- размерная линейка PriceID- ссылка на прайс0лист, по которому берется Price

есть такое правило(1): для всех PID по 1 MID и по 1 PriceID цены должны быть равны.

задача: вывести все MID со всеми PID, с ценами(Price) по PriceID, где хотябы на одном поле не соблюдается правило (1).

надеюсь, задача понятна.

можно сделать примерно так, но я думаю есть решение поумнее.
Код

select * from v_dubleprice as 1
where
count((select * from v_dubleprice as 2 where (2.dpmid=1.dpmid) and (2.dppriceid=1.dppriceid) and (2.dpprice<>1.dpprice)))>0


помогите плс,

Автор: uranpro 2.7.2008, 18:14
Код

SELECT     dpPrices, dpPrice, dpModelID, dpSize, dpMID, dpPID
FROM         v_DublePrices AS a1
WHERE     ((SELECT     COUNT(*) AS Expr1
                         FROM         v_DublePrices AS a2
                         WHERE     (dpMID = a1.dpMID) AND (dpPrices = a1.dpPrices) AND (dpPrice <> a1.dpPrice)) > 0)
ORDER BY dpMID

кому интересно

Автор: Deniz 3.7.2008, 05:44
Цитата(uranpro @  2.7.2008,  21:14 Найти цитируемый пост)
кому интересно 
т.е. про HAVING не слышал.
Код
select dpPrices, dpMID, dpPID, count(distinct dpPrice)
from v_DublePrices
group by dpPrices, dpMID, dpPID
having count(distinct dpPrice) > 1

Автор: uranpro 3.7.2008, 10:08
оО!! чет я не догадался, сложный день вчера был^^

спасибо

Добавлено через 1 минуту и 4 секунды
мне нужно в подписи написать "не ищу легких решений" гы)) smile 

Автор: uranpro 3.7.2008, 10:35
Deniz, этот запрос не выдает никаких данных( и открывается в 2 раза медленнее чем  мой

Автор: Deniz 3.7.2008, 11:25
Цитата(uranpro @  3.7.2008,  13:35 Найти цитируемый пост)
Deniz, этот запрос не выдает никаких данных( и открывается в 2 раза медленнее чем  мой 
так у нас и запросы разные.
У тебя не участвует поле dpPID, убери его из моего запроса.
Возможно много времени занимает count(distinct dpPrice).
Так же нужно проверить наличие индексов по полям dpPrices, dpMID, dpPID.
Можно оставить и твой запрос, но тогда его лучше чуток переделать:
Код
SELECT     dpPrices, dpPrice, dpModelID, dpSize, dpMID, dpPID
FROM         v_DublePrices AS a1
WHERE
  exists(SELECT 1 FROM v_DublePrices AS a2
             WHERE (a2.dpMID = a1.dpMID) AND (a2.dpPrices = a1.dpPrices) AND (a2.dpPrice <> a1.dpPrice)
  )
ORDER BY dpMID

Автор: uranpro 3.7.2008, 12:20
Deniz, а разница межу ними какая? интересно.. быстрее работать будет ? 
тут очень проблемный сервер, постоянно загружен на полную. очень много информации.

Автор: Deniz 3.7.2008, 13:20
Цитата(uranpro @  3.7.2008,  15:20 Найти цитируемый пост)
а разница межу ними какая?
между кем и кем?
Могу сказать точно, что exists лучше чем count(*) > 0, потому как exists заканчивает поиск после первой найденной записи, а count(*) ищет все записи.
По идее запросы твой(с count(*) >0) и мой(с having) должны выполняться примерно одинаково по времени.

Автор: uranpro 3.7.2008, 18:13
на нашем сервере это не так ^^

спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)