2016-08-13 12 views
1

私は、イベントソースの一つが対COALESCE OR条件(SQL)

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

nullにすることができ 異なるソースからのイベントに関する情報が含まれてい Eventテーブル

TABLE Event(
EventId [int] IDENTITY(1,1) NOT NULL, 
EventSource1Id [int] NULL, 
EventSource2Id [int] 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 
) 

私はビューを作成したいと思いますが、わかりません最良の方法は、使用する:OR condition対​​3210を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]) 

はあなたが私にしてください助けてもらえますか?

+2

実行プランを使用して、最も良いものを見てください – Fredou

+0

適切なインデックスを置くことを忘れないでください – Fredou

+0

別名:イベントと会場の間に同じスキーマを持つ2つの別々のイベントソーステーブルが疑わしいようです。イベントごとに2つの(null可能な)イベントソースID。 'Events'、' EventSources'、 'Event_EventSources'、' Venues'のテーブルを持つ方がいいでしょうか? (現在)2つのタイプのイベントソースを区別する必要がある場合、 'EventSourceType'を' EventSources'に追加することができます。また、 'Event_EventSources'テーブルを制限して、任意のイベントに対して3つ以上のイベントソースを許可しないようにできます。 – HABO

答えて

0

通常、COALESCEはより良いクエリプランを生成します。あなたのデータでテストする必要があります。