结果取决于其他表中的值

时间:2014-08-03 11:32:39

标签: sql sql-server tsql

我有以下两个表:

CREATE TABLE [dbo].[ApplicationServers]
(
   [ServerName] [nchar](10) NOT NULL,
   [ApplicationName] [nchar](10) NULL
) 
GO

CREATE TABLE [dbo].[Alerts]
(
   [ServerName] [nchar](10) NULL,
   [AlertDescrption] [nchar](10) NULL,
   [AlertStatus] [int] NULL
)
GO

示例数据:

INSERT [dbo].[ApplicationServers] ([ServerName], [ApplicationName]) 
VALUES (N'Server1   ', N'App1      ')
INSERT [dbo].[ApplicationServers] ([ServerName], [ApplicationName]) 
VALUES (N'Server2   ', N'App1      ')
INSERT [dbo].[ApplicationServers] ([ServerName], [ApplicationName]) 
VALUES (N'Server3   ', N'App1      ')
INSERT [dbo].[ApplicationServers] ([ServerName], [ApplicationName]) 
VALUES (N'Server4   ', N'App2      ')
INSERT [dbo].[ApplicationServers] ([ServerName], [ApplicationName]) 
VALUES (N'Server5   ', N'App2      ')
INSERT [dbo].[Alerts] ([ServerName], [AlertDescrption], [AlertStatus]) 
VALUES (N'Server1   ', NULL, 1)
INSERT [dbo].[Alerts] ([ServerName], [AlertDescrption], [AlertStatus]) 
VALUES (N'Server3   ', NULL, 2)

我试图形成一个显示3列的查询。

Server Name | Application Name | Server Status

服务器状态将通过加入警报表来计算,如果该特定ServerName的记录中只有1,那么它将返回"警告",但如果它在那里有记录" 2"然后它会显示"错误"。如果该ServerName根本没有记录,则返回"正常"。

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:1)

您也可以使用LEFT OUTER JOIN来完成此操作。

SQL Fiddle here

SELECT   aps.ServerName,
         aps.ApplicationName,
         CASE 
              WHEN a.AlertStatus = 1 THEN 'Warning'
              WHEN a.AlertStatus = 2 THEN 'Error'
              ELSE 'Normal'
         END AS AlertStatus
FROM     ApplicationServers aps
LEFT OUTER JOIN  Alerts a
    ON   a.ServerName = aps.ServerName

答案 1 :(得分:0)

SELECT
  a.*,
  CASE ax.Highest
  WHEN 2 THEN 'Error'
  WHEN 1 THEN 'Warning'
  ELSE 'Normal' END
FROM ApplicationServers a
OUTER APPLY
(
  SELECT MAX(AlertStatus) AS Highest
  FROM Alerts b
  WHERE a.ServerName = b.ServerName
) ax

OUTER APPLY涉及两个表A和B,有助于在表B上为表A的每一行执行请求。我们查找任何警报的最高值。根据该值,计算状态。

答案 2 :(得分:0)

对我而言,基本的连接/聚合查询似乎没问题:

SELECT aps.ServerName, aps.ApplicationName,
       (CASE WHEN MAX(a.AlertStatus) = 2 THEN 'Error'
             WHEN MAX(a.AlertStatus) = 1 THEN 'Warning'
             ELSE 'Normal'
        END) as ServerStatus
FROM ApplicationServers aps LEFT JOIN
     Alerts a
     ON aps.ServerName = a.ServerName
GROUP BY aps.ServerName, aps.ApplicationName;

Here是一个SQL小提琴。