2

次の 3 つのテーブルがあります。

  1. 学生に関する表:s41071030(sno, sname, ssex, sage, sdept)

  2. コースに関する表:c41071030(cno, cname, cpno, credit)

  3. コースの選択に関する表:sc41071030(sno, cno, grade)

sdept='CS'ここで、学科で最も多くのコースを選択した学生の詳細を選択したいと思います'CS'

4

2 に答える 2

1
  1. 行を集計sc41071030してカウントを取得します。

  2. 結果を次のように結合しますs41071030

    • で行をフィルタリングしsdeptます。

    • 学生の詳細を取得します。

    • RANK()カウント値で結合された行。

  3. ランキングが 1 の行を選択します。

WITH
  aggregated AS (
    SELECT
      sno,
      COUNT(*) AS coursecount
    FROM
      sc41071030
    GROUP BY
      sno
  ),
  ranked AS (
    SELECT
      s.*,
      RANK() OVER (ORDER BY agg.coursecount DESC) AS rnk
    FROM
      s41071030 s
      INNER JOIN aggregated agg ON s.sno = agg.sno
    WHERE
      s.sdept = 'CS'
  )
SELECT
  sno,
  sname,
  ssex,
  sage,
  sdept
FROM
  ranked
WHERE
  rnk = 1
;
于 2012-05-26T23:24:24.383 に答える
1

多少複雑な SQL ステートメントと同様に、'TDQD' (テスト駆動クエリ設計) を実行するのが最善です。質問の単純な部分から始めて、それらをより複雑な回答にします。

CS 部門の各学生が受講しているコースの数を調べるには、次のように記述します。

SELECT S.Sno, COUNT(*) NumCourses
  FROM s41071030 S
  JOIN sc41071030 SC ON S.Sno = SC.Sno
 WHERE S.Sdept = 'CS'
 GROUP BY S.Sno;

NumCourses の最大値を見つける必要があります。

SELECT MAX(NumCourses) MaxCourses
  FROM (SELECT S.Sno, COUNT(*) NumCourses
          FROM s41071030 S
          JOIN sc41071030 SC ON S.Sno = SC.Sno
         WHERE S.Sdept = 'CS'
         GROUP BY S.Sno
       )

次に、その結​​果をサブクエリと結合する必要があるため、CTE (Common Table Expression) を実行します。

WITH N AS
    (SELECT S.Sno, COUNT(*) NumCourses
       FROM s41071030 S
       JOIN sc41071030 SC ON S.Sno = SC.Sno
      WHERE S.Sdept = 'CS'
      GROUP BY S.Sno
    )
SELECT N.Sno
  FROM N
  JOIN (SELECT MAX(NumCourses) MaxCourses FROM N) M
    ON M.MaxCourses = N.NumCourses;

そして、学生の詳細を取得する必要があるため、それを学生テーブルと結合します。

WITH N AS
    (SELECT S.Sno, COUNT(*) NumCourses
       FROM s41071030 S
       JOIN sc41071030 SC ON S.Sno = SC.Sno
      WHERE S.Sdept = 'CS'
      GROUP BY S.Sno
    )
SELECT S.*
  FROM s41071030 S
  JOIN N ON N.Sno = S.Sno
  JOIN (SELECT MAX(NumCourses) MaxCourses FROM N) M
    ON M.MaxCourses = N.NumCourses;

軽くテストされた SQL: 警告されました。テストするには、コンポーネント クエリを実行し、毎回適切な結果が得られることを確認します。前のクエリが正しく機能するまで、次のクエリに進まないでください。

course テーブルは、解決しようとしているクエリにとって重要ではないことに注意してください。

また、同じ数のコースを受講している複数の学生がいて、その数が受講している学生の最大数であることが判明した場合、これは複数の行を返す可能性があることに注意してください。(したがって、それぞれ 7 つのコースを受講している 3 人の学生がいて、7 つを超えるコースを受講している学生がいない場合、結果セットには 3 つの行が表示されます。)

于 2012-05-26T21:25:34.067 に答える