2016-08-13 4 views
1

I가 Event 이벤트 소스 중 하나가 널이 될 수있는 다른 소스 에서 이벤트에 대한 정보를 포함 테이블COALESCE 대 OR 조건

TABLE Event(
EventId [int] IDENTITY(1,1) NOT NULL, 
EventSource1Id [int] NULL, 
EventSource2Id [int] NULL 
) 

TABLE EventSource1(
Id [int] IDENTITY(1,1) NOT NULL, 
Name [nvarchar](50) NULL, 
VenueId [int] NOT NULL 
) 

TABLE EventSource2(
Id [int] IDENTITY(1,1) NOT NULL, 
Name [nvarchar](50) NULL, 
VenueId [int] NOT NULL 
) 

TABLE Venue(
Id [int] IDENTITY(1,1) NOT NULL, 
TimeZone [nvarchar](100) NOT NULL 
) 

보기를 만들고 싶지만 무엇이 있는지 잘 모르겠습니다. 가장 좋은 방법은 사용 : OR conditioncoalesceJOIN

첫 번째 옵션 :

SELECT 
ev.[Id] AS 'Id', 
ven.[Id] AS 'VenueId' 
FROM Event ev 
LEFT JOIN EventSource1 source1 ON source1.[Id] = ev.EventSource1Id 
LEFT JOIN EventSource2 source1 ON source2.[Id] = ev.EventSource2Id 
LEFT JOIN Venue AS ven ON ven.[Id] = source1.[VenueId] OR v.[Id] = source2.[VenueId] 

두 번째 옵션 :

SELECT 
ev.[Id] AS 'Id', 
ven.[Id] AS 'VenueId' 
FROM Event ev 
LEFT JOIN EventSource1 source1 ON source1.[Id] = ev.EventSource1Id 
LEFT JOIN EventSource2 source1 ON source2.[Id] = ev.EventSource2Id 
LEFT JOIN Venue AS ven ON ven.[Id] = COALESCE(source1.[Id], source2.[Id]) 

당신이 날 도와 줘요 수 있을까요?

+2

실행 계획을 사용하면 무엇이 가장 좋을지 알 수 있습니다. – Fredou

+0

도 올바른 색인을 넣는 것을 잊지 마십시오 – Fredou

+0

다음과 같이 이벤트와 장소 사이에 동일한 스키마가있는 두 개의 개별 이벤트 소스 테이블이 의심스러워 보입니다. 각 이벤트에 대해 두 개의 (null 가능) 이벤트 소스 ID가 있습니다. 'Events','EventSources','Event_EventSources' 및'Venues' 테이블을 갖는 것이 더 합리적이지 않습니까? (현재) 두 가지 유형의 이벤트 소스를 구별 할 필요가 있고 주어진 이벤트에 대해 두 개 이상의 이벤트 소스를 허용하지 않도록 'Event_EventSources' 테이블을 제한 할 수 있다면'EventSourcesType'을'EventSources'에 추가 할 수 있습니다. – HABO

답변

0

일반적으로 COALESCE는 더 나은 쿼리 계획을 생성합니다. 데이터로 테스트해야합니다.