sql - 如何显示一个表中的所有值,但在该表中的两列上显示其他表的值(如果它们的列名相同)

标签 sql sql-server indexing

我有一个表,我可以从中获取所有值。

CREATE TABLE [dbo].[DiagnosticLog]
(
    [DiagnosticLogID]   [int]       NOT NULL identity(-2147483648,1),
    [ServerID]          [int]       NOT NULL, --changed to int for now
    [MessageID]         [smallint]      NOT NULL,
    [Something]         [bigint]        NOT NULL,
    [SomethingElse]         [varchar](100)  NOT NULL,
    [CreateDate]            [smalldatetime] NOT NULL
)

当表中的 MessageID 值相同时,我想用第二个表中的 MessageDescription 替换第一个表中的 MessageID。

CREATE TABLE [dbo].[Message]
(
              [MessageID]     [smallint]     IDENTITY(1,1) NOT NULL,
              [MessageDescription]    [varchar](100)   NOT NULL,
              [CreateDate]     [datetime]    NOT NULL
)  

与 ServerID 列相同。当 ServerID 的值相同时,第一个表中 ServerID 列的值将是 ServerName 的值。

CREATE TABLE [dbo].[Server]
(
    [ServerID]          [smallint]      NOT NULL identity(1,1),
    [ServerName]            [char](20)      NOT NULL,
    [ServerPort]            [int]           NOT NULL,
    [ServerIP]              [char](20)      NOT NULL,
    [CacheType]             [char](10)      NOT NULL,
    [CreateDate]            [datetime]      NOT NULL
)

如果我执行此查询,我可以获得一些我想要的信息,但我希望消息描述替换 MessageId。

SELECT * from DiagnosticLog INNER JOIN  Message  on DiagnosticLog.EBCPMessageID = Message.MessageID

此外,我正在学习 SQL 索引。对我来说,在表上创建索引以便查询速度更快的好方法是什么?我会在 MessageID 和 ServerID 上创建索引吗?

最佳答案

我假设您想要一个查询,而不是实际更新任何值。您可以通过对每个引用的表进行左连接并使用isnull()来确定是否存在相应的值,如果没有,则使用 >ID:

select
    dl.DiagnosticLogID
  , ServerID  = isnull(s.ServerName,convert(char(20),dl.ServerID))
  , MessageID = isnull(m.MessageDescription,convert(varchar(100),dl.MessageID))
  , dl.Something
  , dl.SomethingElse
  , dl.CreateDate
from dbo.DiagnosticLog dl
  left join dbo.Message m
    on dl.MessageID = m.MessageID
  left join dbo.Server s
    on dl.ServerID = s.ServerID

你说“当MessageID的值相同时”,所以我使用了左连接。如果始终存在相应的行,则可以使用内连接来代替,并且不需要考虑null值:

select
    dl.DiagnosticLogID
  , ServerID  = s.ServerName
  , MessageID = m.MessageDescription
  , dl.Something
  , dl.SomethingElse
  , dl.CreateDate
from dbo.DiagnosticLog dl
  inner join dbo.Message m
    on dl.MessageID = m.MessageID
  inner join dbo.Server s
    on dl.ServerID = s.ServerID

关于sql - 如何显示一个表中的所有值,但在该表中的两列上显示其他表的值(如果它们的列名相同),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44929889/

相关文章:

sql - MSSQL 上的 WHERE 子句中的 CASE 语法

sql - 如何通过 Visual Studio/SSDT 将外部表添加到 Azure SQL DB

sql-server - 减少 Azure SQL 数据库大小

MySQL select 看起来很慢但是想不出如何改进?

mysql - 从另一个表中选择带有主键的数据?

SQL 和 DB2 创建命令

sql - 是否有可能在同一触发器运行中混合更新和插入?

sql - 与 1 行合并效率低下

sql - 按照 DTA 的建议添加 NONCLUSTERED INDEX 会提高性能吗?

tsql - SQL Server中索引的排序规则