2012-10-03 2 views
1

안녕하세요, 더 나은 performance.Is 내 SQL.The 질문을 작성하는 다른 방법은 내 쿼리를 즉흥적으로하려고합니다.내 SQL 쿼리 튜닝

SELECT DISTINCT A.name as name, 
       A.gender as gender 
FROM 
(
SELECT * 
FROM Students S, 
     Enrollment E, 
     Group1 G, 
     Ingroup I 
WHERE S.sid = E.sid 
    AND S.sid = I.sid 
    AND I.gid = G.gid 

)A, 
(SELECT * 
FROM Students S, 
     Enrollment E, 
     Group1 G, 
     Ingroup I 
WHERE S.sid = E.sid 
    AND S.sid = I.sid 
    AND I.gid = G.gid 
    AND S.name="Andrew Peers" 
) B 
WHERE A.dept = B.dept 
    AND A.cid = B.cid 
    AND A.gid = B.gid; 
+0

시드 란 무엇입니까? 아, course_id 것으로 보인다 –

+0

예 시드는 과정 ID입니다 – Teja

답변

1

두 개의 하위 쿼리는 너무 많은 행을 반환합니다. 테이블 간의 구조와 관계를 알지 못하므로 두 번째 쿼리의 행 수를 줄이는 것입니다.

SELECT S.name as name, 
     S.gender as gender 
FROM Students S 
     JOIN Enrollment E ON S.sid = E.sid 
     JOIN Ingroup I on S.sid = I.sid 
     JOIN Group1 G on I.gid = G.gid 
     JOIN 
     (SELECT dept, cid, gid 
      FROM Students S 
      JOIN Enrollment E ON S.sid = E.sid 
      JOIN Ingroup I on S.sid = I.sid 
      JOIN Group1 G on I.gid = G.gid 
      WHERE S.name="Andrew Peers" 
     GROUP BY dept, cid, gid 
     ) B 
     ON S.dept = B.dept AND G.cid = B.cid AND G.gid = B.gid; 

하위 쿼리는 동일한 사양과 모든 학생들을 얻을 것이다 부서, CLASS_ID와 앤드류의 그룹 및 다음 쿼리를 반환합니다 또한 ANSI JOIN 구문을 사용합니다.

+0

답변 주셔서 감사합니다. 튜플 관계형 미적분학에서 같은 쿼리를 어떻게 작성합니까? 어떤 통찰력? – Teja

+0

첫째, 나는 수년 전에 CS를 마쳤으며 내 마음은 망각이라는 메커니즘으로 보호 받고 있습니다. 둘째, 당신은 숙제를 소리내어 외칩니다. –

+0

물론 'S'에는 'cid'가 없습니다. –

0

에서 첫 번째 건물 하위 쿼리는 색인을 잃어 성능이 저하되므로 잘못되었습니다. 잘 모르겠어요하지만 난 떠날이 쿼리는 당신의 목적을 제공하면 내가 확인, 4 개 테이블을 사용할 필요가 표시되지 않습니다 ...

Select distinct S.name AS name, 
      S.gender AS gender 
     from Students S, 
      Group1 G, 
      Ingroup I 
    where 1=1 
     AND S.sid = I.sid 
     AND I.gid = G.gid 
     and exists (select 'X' 
        from Students S1 
         , Ingroup I1 
        where 1=1 
         and S1.sid = I1.sid 
         and I1.gid = I.gid 
         and S1.sid = S.sid) 
+0

감사합니다;) did not notice – Deceiver

0

그냥 아이디어를

WITH (SELECT * 
FROM Students S, 
     Enrollment E, 
     Group1 G, 
     Ingroup I 
WHERE S.sid = E.sid 
    AND S.sid = I.sid 
    AND I.gid = G.gid 
    AND S.name="Andrew Peers" 
) Andrew 
SELECT A.name as name, 
       A.gender as gender 

FROM Students S, 
     Enrollment E, 
     Group1 G, 
     Ingroup I 
WHERE S.sid = E.sid 
    AND S.sid = I.sid 
    AND I.gid = G.gid 

    AND g.gid = Andrew.gid 
    AND e.cid = Andrew.cid 
    AND s.dept = Andrew.dept;