2016-08-13 86 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通常会产生更好的查询计划。你应该测试你的数据。