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

Откуда:
Сообщений: 6
Есть 3 таблицы:
_Hotels, _Rooms и _Countries.
связаны они так:
_Rooms.HotelID = _Hotels.ID
_Hotels.CountryID = _Countries.ID

задача такая:
Нужно выбрать набор данных из всех таблиц так чтобы _Hotels.ID не повторялись.
селект приведенный ниже не работает : _Hotels.ID повторяются :(

SELECT DISTINCT  _Hotels.ID, _Rooms.DefaultPrice / _Rooms.OfflinePrice 

FROM    _Rooms INNER JOIN
           _Hotels ON _Rooms.HotelID = _Hotels.ID INNER JOIN
           _Countries ON _Hotels.CountryID = _Countries.ID

ORDER BY _Rooms.DefaultPrice / _Rooms.OfflinePrice

помогите кто может! плиз
заранее спаибо.
6 июн 04, 01:07    [724517]     Ответить | Цитировать Сообщить модератору
 Re: Как использовать DISTINCT с INNER JOIN ?  [new]
ChA
Member

Откуда: Москва
Сообщений: 11137
SELECT 
c.*,
h.*,
(SELECT MAX(r.DefaultPrice/r.OfflinePrice) FROM _Rooms r WHERE r.HotelID = h.ID) AS Coeff
FROM _Countries c
INNER JOIN _Hotels h ON (h.CountryID = c.ID)
ORDER BY c.ID, h.ID, Coeff
Это ?
Вообще-то не совсем понятно, какие поля надо выводить и в каком порядке...
6 июн 04, 04:09    [724558]     Ответить | Цитировать Сообщить модератору
 Re: Как использовать DISTINCT с INNER JOIN ?  [new]
MVM
Member

Откуда:
Сообщений: 271
Имеет место зачача сравнить цены в разных отелях?
Тогда не МАХ, а SUM (или еще что в зависимомти от постановки) и зачем вам в этом запросе COUNTRIES ? И таблицу с меньшим числом записей лучше ставить на 1-ое место
SELECT _Hotels.ID, 
           summa = SUM(_Rooms.DefaultPrice) / SUM(_Rooms.OfflinePrice) 

FROM    _Hotels INNER JOIN
           _Rooms  ON _Rooms.HotelID = _Hotels.ID 
GROUP BY _Hotels.ID

6 июн 04, 08:18    [724572]     Ответить | Цитировать Сообщить модератору
 Re: Как использовать DISTINCT с INNER JOIN ?  [new]
Ugly Kid
Member

Откуда:
Сообщений: 6
задача не в том чтоби сравнить цены.
я просто урезал часть SELECT - а чтобы легче читалось.
Задача вот в чем:
Нужно быбрать 3 гостиницы (_Hotels) так чтобы они не повторялись, для которых соотношение
_Rooms.DefaultPrice / _Rooms.OfflinePrice было наибольшим. Вот полный вариант запроса:

CREATE PROCEDURE FB_LoadGreatDeals
AS
SET NOCOUNT ON
SELECT    DISTINCT TOP 3  _Hotels.ID AS HotelID, 
100 - _Rooms.DefaultPrice * 100 / _Rooms.OfflinePrice AS Discount, 
_Hotels.AccName,
_Hotels.City,
_Countries.Name,
_Rooms.DefaultPrice / _Rooms.OfflinePrice

FROM         

_Rooms INNER JOIN _Hotels ON _Rooms.HotelID = _Hotels.ID 
INNER JOIN  _Countries ON _Hotels.CountryID = _Countries.ID

WHERE     
(_Hotels.Active = 1) AND 
(_Hotels.UserEnable = 1) 
AND (_Rooms.DefaultPrice != 0) AND (_Rooms.OfflinePrice != 0)
ORDER BY _Rooms.DefaultPrice / _Rooms.OfflinePrice
GO


В этом случае если есть 2 комнаты(_Rooms) одной и той же гостиницы (_Hotels) для которых
_Rooms.DefaultPrice / _Rooms.OfflinePrice больше остальных комнат других гостиниц они выводятся и гостица появляется в результате больше одного раза, а нужно чтобы гостиницы не повторялись.
6 июн 04, 13:39    [724688]     Ответить | Цитировать Сообщить модератору
 Re: Как использовать DISTINCT с INNER JOIN ?  [new]
ChA
Member

Откуда: Москва
Сообщений: 11137
SELECT
c.*,
h.*,
r.Coeff
FROM (SELECT TOP 3 HotelID, MAX(_Rooms.DefaultPrice / _Rooms.OfflinePrice) AS Coeff FROM _Rooms GROUP BY HotelID ORDER BY 2) r
INNER JOIN _Hotels h ON (h.HotelID = r.HotelID)
INNER JOIN  _Countries c ON (c.ID = h.CountryID)
Это ?
6 июн 04, 15:05    [724712]     Ответить | Цитировать Сообщить модератору
 Re: Как использовать DISTINCT с INNER JOIN ?  [new]
Ugly Kid
Member

Откуда:
Сообщений: 6
ДА !!! Именно :)
Заработало, СПАСИБО, выручил
6 июн 04, 17:48    [724774]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить