1
我Event
表COALESCE 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 condition
为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])
你能帮助我吗?
使用执行计划来看看什么是最好的 – Fredou
不要忘记也要放正确的索引 – Fredou
另外:两个事件和场地之间有相同模式的独立事件源表看起来很可疑。每个事件有两个(可为空)事件源ID。拥有'Events','EventSources','Event_EventSources'和'Venues'的表是否更有意义?如果您需要区分(目前)两种类型的事件源,并且可以限制“Event_EventSources”表,以禁止任何给定事件使用两个以上的事件源,则可以将“EventSourceType”添加到“EventSources”。 – HABO