2016-09-22 3 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' 나는 두 개의 테이블이있다. 그것은 동일한 VenueId와 NULL VenueId를 가진 모든 이벤트를 가진 이벤트에 대해 가장 저렴한 Venue 옵션입니다. 테이블은 아주 거대하고 수백만 행에 이릅니다. 효율적인 SELECT가 무엇이겠습니까?

데이터베이스는 SQL Server 2012 Standard입니다.

+0

와뿐만 아니라 예상 된 결과 추가 : 여기 아레나스라는 별도의 테이블을 추가하는 예입니다. – 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 
평균 가격 (50) you'l가 'ConcertAtArena3' 얻을이 쿼리와

'Conference' 평균 가격 NULL

+0

스키마를 제어 할 권한이 없습니다. 스키마입니다. –

+0

나는 그것을 얻었지만, 대답의 첫 부분에서 설명했듯이, 그 정보를 검색하기 위해 데이터에 일관성이 없습니다. –

+0

도움을 주셔서 감사합니다. Ionut, 고맙습니다. 나는 네가 의미하는 바를 알고 그것에 대해 생각해야 할 것이다. –

관련 문제