1

こんにちは、パフォーマンスを向上させるためにクエリを即興で作成しようとしています。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; 
4

3 に答える 3

1

2 つのサブクエリが返す行が多すぎます。テーブル間の構造と関係がわからないので、2番目のクエリの行数を減らすしかありません。ANSI 結合構文も使用します。

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、およびアンドリューのグループを返し、クエリは同じスペックを持つすべての学生を取得します。

于 2012-10-03T06:07:16.860 に答える
0

from で最初にサブクエリを作成すると、インデックスが失われ、パフォーマンスが低下するため、不適切です。よくわかりませんが、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)
于 2012-10-03T09:11:20.143 に答える
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; 
于 2012-10-03T21:40:14.010 に答える