Q:

How to display all the values from one table but on two columns in that table, display the value of other tables if their column name is the same

I have a table that I will get all the values from.
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
)

I want to replace the MessageID in the first table with the MessageDescription in the second table when the value of the MessageID in the tables are the same.
CREATE TABLE [dbo].[Message]
(
              [MessageID]     [smallint]     IDENTITY(1,1) NOT NULL,
              [MessageDescription]    [varchar](100)   NOT NULL,
              [CreateDate]     [datetime]    NOT NULL
)  

same with the ServerID column. The value of ServerID column from the first table will be the value of ServerName when the value of the ServerID's are the same.
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
)

If I do this query I can get some of the information I want but I want the Message Description to replace MessageId.
SELECT * from DiagnosticLog INNER JOIN  Message  on DiagnosticLog.EBCPMessageID = Message.MessageID

Also, I'm learning about indexing for SQL. What would be a good way for me to make indexes on the tables so it queries faster? Would I create an index on MessageID and ServerID?

A:

I am assuming you want a query, not to actually update any values. You can do this with a left join to each of the referenced tables and using isnull() to determine if there is a corresponding value, and if not, use the 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

You say 'when the value of MessageID is the same', so I have used left joins. If there will always be a corresponding row, you can use inner joins instead, and you would not need to account for null values: 
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

