Sql 需要帮助合并查询吗
我需要帮助合并两个查询。查询1查看所有节点的主列表。标题。但是,并非所有节点都存在请求的数据网络流量。我希望使用组合查询从InterfaceTraffic表中提取网络流量,请参见查询1。但是,如果该表中不存在数据,则从VIM_VMStatistics表查询2中提取该数据 问题1Sql 需要帮助合并查询吗,sql,sql-server,Sql,Sql Server,我需要帮助合并两个查询。查询1查看所有节点的主列表。标题。但是,并非所有节点都存在请求的数据网络流量。我希望使用组合查询从InterfaceTraffic表中提取网络流量,请参见查询1。但是,如果该表中不存在数据,则从VIM_VMStatistics表查询2中提取该数据 问题1 SELECT Caption ,Round(InAVG, 2) AS NetInAverage_Kbps ,Round(InMAX, 2) AS NetInMax_Kbps ,Round(OutA
SELECT Caption
,Round(InAVG, 2) AS NetInAverage_Kbps
,Round(InMAX, 2) AS NetInMax_Kbps
,Round(OutAVG, 2) AS NetOutAverage_Kbps
,Round(OutMAX, 2) AS NetOutMax_Kbps
FROM (
SELECT caption
,nodeid
FROM Nodes
) n
INNER JOIN (
SELECT nodeid
,AVG(In_Averagebps) / 1024 AS InAVG
,MAX(In_Maxbps) / 1024 AS InMAX
,AVG(Out_Averagebps) / 1024 AS OutAVG
,MAX(Out_Maxbps) / 1024 AS OutMAX
FROM InterfaceTraffic
WHERE DATETIME >= DATEADD(MONTH, datediff(MONTH, 0, getdate()) - 1, 0)
AND DATETIME < DATEADD(MONTH, datediff(MONTH, 0, getdate()), 0)
GROUP BY nodeid
) l ON n.NodeID = l.NodeID
ORDER BY Caption
问题2
SELECT NAME
,Round(InAVG, 2) AS NetInAverage_Kbps
,Round(InMAX, 2) AS NetInMax_Kbps
,Round(OutAVG, 2) AS NetOutAverage_Kbps
,Round(OutMAX, 2) AS NetOutMax_Kbps
FROM (
SELECT NAME
,VirtualMachineID
,NodeID
FROM VIM_VirtualMachineNodes
) n
INNER JOIN (
SELECT VirtualMachineID
,AVG(AvgNetworkReceiveRate) AS InAVG
,MAX(MaxNetworkReceiveRate) AS InMAX
,AVG(AvgNetworkTransmitRate) AS OutAVG
,MAX(MaxNetworkTransmitRate) AS OutMAX
FROM VIM_VMStatistics
WHERE DATETIME >= DATEADD(MONTH, datediff(MONTH, 0, getdate()) - 1, 0)
AND DATETIME < DATEADD(MONTH, datediff(MONTH, 0, getdate()), 0)
GROUP BY VirtualMachineID
) l ON n.VirtualMachineID = l.VirtualMachineID
不需要这些可爱的小个子选择。这将完全相同
SELECT n.Caption
,Round(InAVG, 2) AS NetInAverage_Kbps
,Round(InMAX, 2) AS NetInMax_Kbps
,Round(OutAVG, 2) AS NetOutAverage_Kbps
,Round(OutMAX, 2) AS NetOutMax_Kbps
FROM Nodes n
INNER JOIN (
SELECT nodeid
,AVG(In_Averagebps) / 1024 AS InAVG
,MAX(In_Maxbps) / 1024 AS InMAX
,AVG(Out_Averagebps) / 1024 AS OutAVG
,MAX(Out_Maxbps) / 1024 AS OutMAX
FROM InterfaceTraffic
WHERE DATETIME >= DATEADD(MONTH, datediff(MONTH, 0, getdate()) - 1, 0)
AND DATETIME < DATEADD(MONTH, datediff(MONTH, 0, getdate()), 0)
GROUP BY nodeid
) l ON n.NodeID = l.NodeID
ORDER BY Caption
SELECT n.NAME
,Round(InAVG, 2) AS NetInAverage_Kbps
,Round(InMAX, 2) AS NetInMax_Kbps
,Round(OutAVG, 2) AS NetOutAverage_Kbps
,Round(OutMAX, 2) AS NetOutMax_Kbps
FROM VIM_VirtualMachineNodes n
INNER JOIN (
SELECT VirtualMachineID
,AVG(AvgNetworkReceiveRate) AS InAVG
,MAX(MaxNetworkReceiveRate) AS InMAX
,AVG(AvgNetworkTransmitRate) AS OutAVG
,MAX(MaxNetworkTransmitRate) AS OutMAX
FROM VIM_VMStatistics
WHERE DATETIME >= DATEADD(MONTH, datediff(MONTH, 0, getdate()) - 1, 0)
AND DATETIME < DATEADD(MONTH, datediff(MONTH, 0, getdate()), 0)
GROUP BY VirtualMachineID
) l ON n.VirtualMachineID = l.VirtualMachineID
现在我们将其加入到两个列表中,并使用coalesce选择项目
SELECT
COALESCE(l1.nodeid, l2.nodeid, 0) as nodeid,
COALESCE(l1.InAVG, l2.InAVE, 0.0) AS NetInAverage_Kbps,
COALESCE(l1.InMAX, l2.InMAX, 0.0) AS NetInMax_Kbps,
COALESCE(l1.OutAVG, l1.OutAVG, 0.0) AS NetOutAverage_Kbps,
COALESCE(l1.OutMAX, l1.OutMAX, 0.0) AS NetOutMax_Kbps
FROM (
SELECT DISTINCT nodeid
FROM (
SELECT nodeid from nodes
UNION ALL
SELECT nodeid from VIM_VirtualMachineNodes
) as node_list
) as N
LEFT JOIN (
SELECT nodeid
,AVG(In_Averagebps) / 1024 AS InAVG
,MAX(In_Maxbps) / 1024 AS InMAX
,AVG(Out_Averagebps) / 1024 AS OutAVG
,MAX(Out_Maxbps) / 1024 AS OutMAX
FROM InterfaceTraffic
WHERE DATETIME >= DATEADD(MONTH, datediff(MONTH, 0, getdate()) - 1, 0)
AND DATETIME < DATEADD(MONTH, datediff(MONTH, 0, getdate()), 0)
GROUP BY nodeid
) l1 ON n.NodeID = l1.NodeID
LEFT JOIN (
SELECT nodeid
,AVG(AvgNetworkReceiveRate) AS InAVG
,MAX(MaxNetworkReceiveRate) AS InMAX
,AVG(AvgNetworkTransmitRate) AS OutAVG
,MAX(MaxNetworkTransmitRate) AS OutMAX
FROM VIM_VMStatistics
WHERE DATETIME >= DATEADD(MONTH, datediff(MONTH, 0, getdate()) - 1, 0)
AND DATETIME < DATEADD(MONTH, datediff(MONTH, 0, getdate()), 0)
GROUP BY VirtualMachineID
) l2 ON n.NodeID = l2.NodeID
正如您所看到的,我并不在意名称,但是如果您愿意,您可以加入子查询中的名称。您可以在查询1和查询2的左侧外部联接的节点上执行查询。为简单起见,我们假设: 您有查询1和查询2的视图 Query1和Query2每个节点最多返回一行标题 然后查询如下所示:
SELECT caption,
(CASE WHEN Q1.Caption IS NULL THEN Q2.NetInAverage_Kbps
ELSE Q1.NetInAverage_Kbps END) AS NetInAverage_Kpbs,
(CASE WHEN Q1.Caption IS NULL THEN Q2.NetInMax_Kbps
ELSE Q1.NetInMax_Kbps END) AS NetInMax_Kbps,
(CASE WHEN Q1.Caption IS NULL THEN Q2.NetOutAverage_Kbps
ELSE Q1.NetOutAverage_Kbps END) AS NetOutAverage_Kbps,
(CASE WHEN Q1.Caption IS NULL THEN Q2.NetOutMax_Kbps
ELSE Q1.NetOutAverage_Kbps END) AS NetOutMax_Kbps
FROM Nodes N
LEFT OUTER JOIN Query1 Q1 ON N.Caption=Q1.Caption
LEFT OUTER JOIN Query2 Q2 ON N.Caption=Q2.Name
此查询检查Query1中是否有行,如果没有,则使用Query2,否则使用Query1。请在提交之前预览您的文章……标题、节点ID、名称、虚拟机器ID之间的关系是什么?如果没有关系,则无法将它们组合在一起。您没有告诉我们这种关系-我们需要它来组合它们。我忘了添加nodeid确实存在于Nodes表和VIM_VirtualMachineNodes中。但是,vim_vimstatistics的nodeid不存在。此表仅包含virtualmachineid
SELECT caption,
(CASE WHEN Q1.Caption IS NULL THEN Q2.NetInAverage_Kbps
ELSE Q1.NetInAverage_Kbps END) AS NetInAverage_Kpbs,
(CASE WHEN Q1.Caption IS NULL THEN Q2.NetInMax_Kbps
ELSE Q1.NetInMax_Kbps END) AS NetInMax_Kbps,
(CASE WHEN Q1.Caption IS NULL THEN Q2.NetOutAverage_Kbps
ELSE Q1.NetOutAverage_Kbps END) AS NetOutAverage_Kbps,
(CASE WHEN Q1.Caption IS NULL THEN Q2.NetOutMax_Kbps
ELSE Q1.NetOutAverage_Kbps END) AS NetOutMax_Kbps
FROM Nodes N
LEFT OUTER JOIN Query1 Q1 ON N.Caption=Q1.Caption
LEFT OUTER JOIN Query2 Q2 ON N.Caption=Q2.Name