これは私を夢中にしており、それは可能ではないかもしれません。私は以下の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
これはカーソルで最も効果的ですか?
ブリリアント!ありがとう。私はCOALESCEを忘れていました。 –