2011-03-04 5 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

+2

어느 SQL ... SQL 서버, Oracle, MySQL ??? – DRapp

+0

SQL Server 2005 – user453949

답변

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 

참고 : 사용 된 이후 인터페이스는 항상 아래로 항상, 또는 경우, 원래 쿼리에서,이 결과 집합에 표시되지 것입니다 a INNER JOIN.

+1

+1 나를 이길. –

0

내가 인터페이스의 내부 쿼리를 단순화 할 것이다. 왜냐하면 그 전체적인 기반이 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 
관련 문제