Sql 需要帮助合并查询吗

Sql 需要帮助合并查询吗,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

我需要帮助合并两个查询。查询1查看所有节点的主列表。标题。但是,并非所有节点都存在请求的数据网络流量。我希望使用组合查询从InterfaceTraffic表中提取网络流量,请参见查询1。但是,如果该表中不存在数据,则从VIM_VMStatistics表查询2中提取该数据

问题1

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