这个让我发疯,甚至可能不可能。我在下面列出了四个表。为简洁起见,我删除了不重要的列、索引、键、外键等。
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
我正在尝试在历史表上创建一个 View 。 View 中棘手的列是 ClientName。如果 History.ClientID 不为 null 则很容易。但是如果History.ClientID为null,而ObjectID不为null,则需要通过History.ObjectID->Object.ClientID->Client.ClientName获取ClientName。
这是我能想到的最好的方法,如果 History.ClientID 不为空,它就可以工作,但是如果 History.ClientID 为空,我不知道如何通过 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
最好用游标来完成吗?
最佳答案
我想你的意思是这样的:
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
关于sql-server - 一个 View 中四个表的 SQL Server 条件连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40911732/