2016-09-22 4 views
-1

スキーマは少し奇妙です。このようなSQL - 最も安いオプションのリストを生成する

CREATE TABLE [dbo].[Events](
    [Id] [int] NOT NULL, 
    [Name] [varchar](50) NOT NULL, 
    [VenueId] [int] NULL 
) 

CREATE TABLE [dbo].[Venues](
    [Id] [int] NOT NULL, 
    [Name] [nvarchar](50) NOT NULL, 
    [AveragePrice] [int] NOT NULL 
) 

とデータ:

insert into Venues (Id, Name, AveragePrice) VALUES 
    (1, 'Arena1', 100), 
    (1, 'Arena2', 200), 
    (1, 'Arena3', 50), 
    (2, 'Club1', 50), 
    (2, 'Club2', 150) 

insert into Events (Id, Name, VenueId) VALUES 
    (1, 'ConsertAtArena1', 1), 
    (2, 'ConsertAtArena2', 1), 
    (3, 'ConsertAtArena3', 1), 
    (2, 'Conference', NULL) 

私は生成する必要があります:'ConsertAtArena3', 'Conference'私は2つのテーブルを持っています。これは、同じVenueIdとNULL VenueIdを持つすべてのイベントに加えて、同じVenueIdを持つイベントで最も安いVenueオプションです。テーブルは非常に大規模で、数百万行までです。効率的なSELECTを実行するにはどうすればよいでしょうか?

データベースはSQL Server 2012 Standardです。

+0

と平均価格は50と'Conference''ConcertAtArena3'を得るだけでなく期待された結果を追加します。 – jarlh

+0

あなたが必要とするのは、クエリコストを見るための実行計画です! – Ragul

+2

「ConsertAtArena3」はどのように*最も安い*でしょうか? 3つのコンサートはすべて同じ 'venueId'リファレンスを持っているので、すべて同じ価格です。 –

答えて

1

データの保存方法に問題があるようです。あなたの例では、すべて'ConcertAtArena1''ConcertAtArena2'および'ConcertAtArena3'は、Venuesテーブルで複数回定義した同じ場所にリンクされています。

会場のIDが同じであるため、なぜ'Arena3'のためのイベントとして正解 "ConcertAtArena1'ではありません。あなたはその名前に何らかの冗談な論理を使っていますか?

アリーナを別の場所として保管するか、価格があり、各競技場が一意である別のサブテーブルを追加する必要があります。ここで私はアリーナと呼ばれる余分なテーブルを追加した例です。このクエリでは

DECLARE @Events TABLE (
    [Id] [int] NOT NULL, 
    [Name] [varchar](50) NOT NULL, 
    [ArenaId] [int] NULL 
) 

DECLARE @Venues TABLE(
    [Id] [int] NOT NULL, 
    [Name] [nvarchar](50) NOT NULL 
) 

DECLARE @arenas TABLE(
    [Id] [int] NOT NULL, 
    [VenueId] INT NOT NULL, 
    [Name] [nvarchar](50) NOT NULL, 
    [AveragePrice] [int] NOT NULL 
) 


insert into @venues (id, name) values 
(1, 'Venue1'), 
(2, 'Venue2') 

insert into @arenas (Id, VenueId, Name, AveragePrice) VALUES 
    (1,1, 'Arena1', 100), 
    (2,1, 'Arena2', 200), 
    (3,1, 'Arena3', 50), 
    (4,2, 'Club1', 50), 
    (5,2, 'Club2', 150) 

insert into @Events (Id, Name, ArenaId) VALUES 
    (1, 'ConsertAtArena1', 1), 
    (2, 'ConsertAtArena2', 2), 
    (3, 'ConsertAtArena3', 3), 
    (4, 'Conference', NULL) 

;WITH ranked AS (
SELECT e.Id, a.AveragePrice, ROW_NUMBER() OVER (PARTITION BY a.VenueId ORDER BY a.AveragePrice) AS rn 
FROM @Events e 
LEFT OUTER JOIN @arenas a ON a.Id = e.ArenaId) 

SELECT e.id,e.name,r.AveragePrice FROM @Events e 
INNER JOIN ranked r ON r.Id = e.Id 
WHERE r.rn = 1 

you'l平均価格NULL

+0

私はスキーマを制御することはできません、それはそれです。 –

+0

私はそれを知っていますが、答えの最初の部分で説明したように、その情報を取得するためにデータに一貫性がありません。 –

+0

あなたの助けをありがとうIonut、私はそれを感謝します。私はあなたが何を意味するかを見て、それについて考える必要があります。 –

関連する問題