2016-12-01 67 views
1

這是一個讓我發瘋的事情,甚至可能都不可能。我有以下四個表格。爲簡潔起見,我刪除了不重要的列,索引,鍵,外鍵等。一個視圖中四個表的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 null,但ObjectID 不是,那麼它需要通過History.ObjectID-> Object.ClientID-> Client.ClientName獲取ClientName。

這是最好的我可以拿出來,它的工作原理如果History.ClientID不爲空,但我不知道如何通過ObjectID獲取ClientName如果History.ClientID爲null。我希望這一切都很清楚。

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。沒有看到你的數據,這是不是我們可以肯定的說。