我有一个表,我可以从中获取所有值。
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/