合并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
forJOIN
第一种选择:
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])