2011-03-04 16 views
2

我想統計接口的數量,並寫出這個代碼,它們從兩個表節點和接口中統計出來。此代碼有效,但我想知道其他方式或優化此代碼?數數的最佳方法是什麼?如何優化我的查詢?

 

     SELECT 
    q1.NodeName, 
    q1.Nup as up, 
    q2.ndown as down 
    FROM (
    SELECT 
     Nodes.NodeID AS NodeID, 
     Interfaces.NodeID AS InterfaceID, 
     Nodes.Caption AS NodeName, 
     Interfaces.Status as Status, 
     Count(Nodes.Caption) as Nup 
     FROM 
     Nodes INNER JOIN Interfaces ON (Nodes.NodeID = Interfaces.NodeID) 
     WHERE 
     (
      (
      (Interfaces.Status = '2')) 
     ) 
     GROUP BY Nodes.NodeID, Nodes.Caption, Interfaces.Status, Interfaces.NodeID 
    ) AS q1 
    INNER JOIN (
SELECT 
Interfaces.NodeID AS InterfaceID, 
Nodes.Caption AS NodeName, 
Interfaces.Status as Status, 
Count(Nodes.Caption) as ndown 
FROM 
Nodes INNER JOIN Interfaces ON (Nodes.NodeID = Interfaces.NodeID) 
WHERE 
(
    (
    (Interfaces.Status = '1')) 
) 

GROUP BY Nodes.NodeID, Nodes.Caption, Interfaces.Status, Interfaces.NodeID 

    ) AS q2 

ON (q1.NodeID = q2.InterfaceID) 
order by down Desc 

 
+0

你有什麼指數?你的桌子結構是什麼? – JNK 2011-03-04 20:10:31

+2

哪個SQL ... SQL-Server,Oracle,MySQL ??? – DRapp 2011-03-04 20:11:56

+0

sql server 2005 – user453949 2011-03-05 05:10:13

回答

4

您可以組合查詢:

SELECT 
    Nodes.Caption AS NodeName, 
    Count(
     CASE WHEN Interfaces.Status = '2' 
     THEN 1 
     ELSE NULL 
     END) as up, 
    Count(
     CASE WHEN Interfaces.Status = '1' 
     THEN 1 
     ELSE NULL 
     END) as down 
FROM Nodes 
    INNER JOIN Interfaces ON (Nodes.NodeID = Interfaces.NodeID) 
WHERE Interfaces.Status IN('1', '2') 
GROUP BY Nodes.NodeID, Nodes.Caption 
order by 3 Desc 

注意:您原來的查詢,如果接口始終處於up,或總是下跌,也不會在結果中顯示,因爲你正在使用一個INNER JOIN

+1

+1擊敗我。 – 2011-03-04 20:14:31

0

我會簡化接口上的內部查詢,因爲這是WHERE的整個基礎,直到THAT結果集完成後才需要連接到節點,那麼一旦單個節點完成,就連接到節點。

SELECT 
     Nodes.NodeName, 
     Q1.CountUp as Up, 
     Q1.CountDown as Down 
    FROM 
     (SELECT 
       Interfaces.NodeID AS InterfaceID, 
       SUM(CASE WHEN Interfaces.Status = '1' then 1 else 0 end) as CountUp, 
       SUM(CASE WHEN Interfaces.Status = '2' then 1 else 0 end) as CountDown 
      FROM 
       Interfaces 
      WHERE 
       Interfaces.Status IN ('1','2') 
      GROUP BY 
       1) AS q1 
     INNER JOIN Nodes 
     ON q1.NodeID = Nodes.NodeID 
    order by 
     3 desc