2016-12-01 22 views
1

これは私を夢中にしており、それは可能ではないかもしれません。私は以下の4つのテーブルを持っています。簡潔にするために私は歴史の表のビューを作成しようとしています重要でないカラム、インデックス、キー、外部キーなどビュー内の4つのテーブルのSQL Server条件付き結合

CREATE TABLE Client(
    ClientID uniqueidentifier ROWGUIDCOL NOT NULL DEFAULT (newid()), 
    ClientName varchar(250) not null 
); 
GO 

CREATE TABLE Instance(
    InstanceID uniqueidentifier ROWGUIDCOL NOT NULL DEFAULT (newid()), 
    ClientID uniqueidentifier not null, /* FK into Client */ 
    InstanceName varchar(48) not null 
); 
GO 

CREATE TABLE Object(
    ObjectID uniqueidentifier ROWGUIDCOL NOT NULL DEFAULT (newid()), 
    ClientID uniqueidentifier not null, /* FK into Client */ 
    InstanceID uniqueidentifier null, /* FK into Instance */ 
    Path varchar(260) not null 
); 
GO 

CREATE TABLE History(
    Timestamp datetime DEFAULT (getdate()), 
    ClientID uniqueidentifier null,  /* if not null, references Client */ 
    InstanceID uniqueidentifier null, /* if not null, references Instance */ 
    ObjectID uniqueidentifier null,  /* if not null, references Object */ 
    Details varchar(1024) 
); 
GO 

を削除しました。ビューのトリッキーな列はクライアント名です。 History.ClientIDがnullでない場合は、簡単です。しかし、History.ClientID ですが、ObjectID でない場合、History.ObjectID-> Object.ClientID-> Client.ClientNameを介してClientNameを取得する必要があります。

これは、History.ClientIDがnullではない場合に機能しますが、History.ClientIDがnullの場合、ObjectIDでClientNameを取得する方法はわかりません。私はこれがいくぶん明確であることを願っています。

CREATE VIEW History_Report as 
SELECT 
     H.TimeStamp, 
     C.ClientName, 
     Q.InstanceName, 
     O.Path, 
     H.Details 
from 
    History H 
    left join Instance Q ON (H.InstanceID = Q.InstanceID) 
    left join Object O on (H.ObjectID = O.ObjectID) 
    left join Client C on (H.ClientID = C.ClientID) 
GO 

これはカーソルで最も効果的ですか?

答えて

1

は、私はあなたがこのような何かを意味すると思う:

CREATE VIEW History_Report as 
SELECT 
     H.TimeStamp, 
     COALESCE(C.ClientName, CO.ClientName) ClientName, 
     Q.InstanceName, 
     O.Path, 
     H.Details 
from 
    History H 
    left join Instance Q ON (H.InstanceID = Q.InstanceID) 
    left join Object O on (H.ObjectID = O.ObjectID) 
    left join Client C on (H.ClientID = C.ClientID) 
    LEFT JOIN Client CO ON (O.ClientID = CO.ClientID) 
GO 
+0

ブリリアント!ありがとう。私はCOALESCEを忘れていました。 –

1

簡単なアプローチは、単にあなたのクエリに追加joinを追加することです:あなたが重複するときに注意する必要があるでしょうけれども

CREATE VIEW History_Report as 
SELECT 
     H.TimeStamp, 
     isnull(C.ClientName, CO.ClientName) as ClientName, 
     Q.InstanceName, 
     O.Path, 
     H.Details 
from History H 
    left join Instance Q 
     on(H.InstanceID = Q.InstanceID) 
    left join Object O 
     on(H.ObjectID = O.ObjectID) 
    left join Client C 
     on(H.ClientID = C.ClientID) 
    left join Client CO 
     on(O.ClientID = CO.ClientID 
      and H.ClientID is null -- This will help limit duplicates 
     ) 
GO 

この方法でさらにjoinを追加します。あなたのデータを見ることなく、これは確かに言えることではありません。

関連する問題