我有以下两个表:
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根本没有记录,则返回"正常"。
有人可以帮忙吗?
答案 0 :(得分:1)
您也可以使用LEFT OUTER JOIN来完成此操作。
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小提琴。