@ellz

Почему запрос дублирует данные?

Есть такой запрос:
SELECT
HotelsRooms.roomTypeID as RoomType,
HotelsRooms.price * 5  + tours.Price as Price
FROM dbo.HotelsRooms 
INNER JOIN dbo.Hotels as hotels ON HotelsRooms.HotelID = hotels.Id
INNER JOIN dbo.Tours as tours ON tours.HotelID = hotels.Id
WHERE hotels.Name = N'Mountview Lodge Apt'

Он дублирует результат.
Если убрать JOIN Tours, то все будет нормально. Но мне нужна сущность Tours.
Пример

С join:
RoomType Price
1	50500
2	57875
3	56400
4	61415
5	63775
1	50500
2	57875
3	56400
4	61415
5	63775

Без join
RoomType Price
1	50500
2	57875
3	56400
4	61415
5	63775

Таблицы:

Tours:
CREATE TABLE [dbo].[Tours] (
    [Id]       INT  IDENTITY (1, 1) NOT NULL,
    [HotelID]  INT  NOT NULL,
    [FromDate] DATE NOT NULL,
    [ToDate]   DATE NOT NULL,
    [Price]    INT  NOT NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);

Cities:
CREATE TABLE [dbo].[Cities] (
    [Id]        INT           IDENTITY (1, 1) NOT NULL,
    [Name]      NVARCHAR (90) NOT NULL,
    [CountryID] INT           NOT NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);

Countrys:
CREATE TABLE [dbo].[Countrys] (
    [Id]   INT           IDENTITY (1, 1) NOT NULL,
    [Name] NVARCHAR (90) NOT NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);

Hotels:
CREATE TABLE [dbo].[Hotels] (
    [Id]                INT            IDENTITY (1, 1) NOT NULL,
    [City]              INT            NOT NULL,
    [Rating]            INT            NOT NULL,
    [Name]              NVARCHAR (60)  NOT NULL,
    [DistanceToBeach]   INT            NULL,
    [Line]              INT            NULL,
    [DistanceToAirport] INT            NOT NULL,
    [Discription]       NVARCHAR (MAX) NOT NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);

HotelsRooms:
CREATE TABLE [dbo].[HotelsRooms] (
    [Id]         INT IDENTITY (1, 1) NOT NULL,
    [HotelID]    INT NOT NULL,
    [roomTypeID] INT NOT NULL,
    [price]      INT NOT NULL,
    [count]      INT NOT NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);

HotelsRommTypes:
CREATE TABLE [dbo].[HotelRoomTypes] (
    [Id]         INT IDENTITY (1, 1) NOT NULL,
    [SingleBeds] INT NULL,
    [DoubleBeds] INT NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);

  • Вопрос задан
  • 166 просмотров
Решения вопроса 1
@luna3956
Потому, что в таблице Tours один отель может фигурировать более одного раза, в зависимости от дат тура(fromDate И toDate). Если у вас цена фиксированная для любых дат, то джойните не таблицу Tours а такое:
...
inner join (select distinct hotelId,price from Tours)

Если же цена может быть разной в зависимости от дат, то произошедшее "дублирование" логически правильно. просто добавьте вывод дат из таблицы Tours в ваш запрос и увидите
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы