合并vs或联接条件(SQL)

合并vs或联接条件(SQL),sql,sql-server,tsql,join,coalesce,Sql,Sql Server,Tsql,Join,Coalesce,我有事件表 TABLE Event( EventId [int] IDENTITY(1,1) NOT NULL, EventSource1Id [int] NULL, EventSource2Id [int] NULL ) 包含来自不同来源的事件信息的 其中一个事件源可以为null TABLE EventSource1( Id [int] IDENTITY(1,1) NOT NULL, Name [nvarchar](50) NULL, VenueId [int] NOT NULL ) 及

我有
事件

TABLE Event(
EventId [int] IDENTITY(1,1) NOT NULL,
EventSource1Id [int] NULL,
EventSource2Id [int] NULL
)
包含来自不同来源的事件信息的 其中一个事件源可以为null

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

我想创建视图,但我不确定最好的使用方法是什么:
coalesce
vs
或condition
for
JOIN

第一种选择:

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])

您能帮帮我吗?

合并通常会产生更好的查询计划。你应该用你的数据进行测试。

使用执行计划来看看最好的方法。别忘了把适当的索引放在一边:两个独立的事件源表,在事件和地点之间有相同的模式,看起来可疑。每个事件有两个(可为空)事件源id。为
事件
事件源
事件源
场馆
设置表格不是更有意义吗?如果需要区分(目前)两种类型的事件源,可以将
EventSourceType
添加到
EventSources
中,并且可以限制
event\u EventSources
表不允许任何给定事件有两个以上的事件源。这两个事件源不等效。
source1.Id的非空值将阻止它查看
source2
。这可能适用于您拥有的数据,但通常情况下并非如此。我知道你说过“其中一个可以是空的”,但这和“其中一个总是空的”不一样。
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])