2016-08-13 60 views
1

EventCOALESCE VS OR條件JOIN(SQL)

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 
) 

我想創建視圖,但我不確定是什麼用最好的方式:​​3210 VS OR conditionJOIN

第一種選擇:

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

另外:兩個事件和場地之間有相同模式的獨立事件源表看起來很可疑。每個事件有兩個(可爲空)事件源ID。擁有'Events','EventSources','Event_EventSources'和'Venues'的表是否更有意義?如果您需要區分(目前)兩種類型的事件源,並且可以限制「Event_EventSources」表,以禁止任何給定事件使用兩個以上的事件源,則可以將「EventSourceType」添加到「EventSources」。 – HABO

回答

0

COALESCE通常會產生更好的查詢計劃。你應該測試你的數據。