sql-server - 一个 View 中四个表的 SQL Server 条件连接

标签 sql-server windows join view left-join

这个让我发疯,甚至可能不可能。我在下面列出了四个表。为简洁起见,我删除了不重要的列、索引、键、外键等。

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.ClientIDnull,而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/

相关文章:

windows - 监听 UDP 多播数据包

python - 连接两个 DataFrame 并替换 Python 中的列值

mysql - SQL 从其他表中选择具有相应值的列

java - 字符串或二进制数据将在输入数据库时​​被截断

windows - Powershell:导出用户权限分配

sql - 如果 > 300 条记录或最近 300 条记录,则查询最近 10 分钟

c - 如何确保 C 代码中没有浮点运算(Visual Studio 2013 express + WDK 8.1,WDM 内核驱动程序)?

linux - 如何使用粘贴/加入或 linux 或 perl 以有序方式有效地加入 'n' 个文件?

sql-server - SqlPackage.exe 提取数据和架构验证

sql - SQL Server 中数字的通配符