検索

ホームページ  >  に質問  >  本文

2 つの SQL テーブルを結合するときに列を切り替える

シナリオは、学生テーブルがあり、クラスが 4 つあり、部屋番号しか知らない場合です。また、テーブルが 2 つあり、1 つは教師の名前と部屋番号、もう 1 つは教師の名前と担当科目が記載されています。ここで、生徒は数学の先生が誰であるかを知りたいと考えています。生徒の名前と数学の先生の名前だけが必要です。

これは、私が取り組んでいるバウチャー プロジェクトの架空のシナリオです。多くの状況で動作するようになりましたが、非常に遅いです。新しい列を作成するためのケース条件では何も速度が低下することはありません。学生テーブルを教師テーブルに関連付ける列がわからないため、同じケース条件を使用してテーブルを結合したままにしました。左結合のケース条件が問題を引き起こしているようですが、遅延なく同じ結果を得るために使用できる他の方法はありますか?

P粉285587590P粉285587590278日前408

全員に返信(1)返信します

  • P粉514458863

    P粉5144588632024-02-27 00:26:59

    あなたがこれほど多くの問題を抱えているのは、あなたのアーキテクチャがあまり良くないからだと思います。具体的には、各コース/部屋番号の列がある学生テーブルのスキーマです。

    私は最初にサブクエリを使用してこの問題を修正しました。例:

    SELECT `学生名`、期間として 1、ルームとして `1st Room#` を学生から選択します
    すべてを結合する
    `学生名`、期間として 2、ルームとして `2nd Room#` を学生から選択します。
    すべてを結合する
    `学生名`、期間として 3、部屋として `3rd Room#` を学生から選択します。
    すべてを結合する
    `学生名`、期間として 4、部屋からの学生として `4th Room#`を選択します

    このように「ピボットを解除」すると、きれいな Student Name | Period | Room スキーマが得られ、この問題の解決がはるかに簡単になります。

    SELECT `生徒名`、件名.`教師名`
    から
        (
          `学生名`、期間として 1、部屋として `1st Room#` を学生から選択します
          すべてを結合する
          `学生名`、期間として 2、ルームとして `2nd Room#` を学生から選択します。
          すべてを結合する
          `学生名`、期間として 3、部屋として `3rd Room#` を学生から選択します。
          すべてを結合する
          `学生名`、期間として 4、部屋として `4th Room#` を学生から選択します。
        ) 学生
        INNER JOIN 教師ルーム
           ON students.Room = TeacherRoom.`部屋番号`
        INNER JOIN 教師件名
           ON TeacherRoom.`教師名` = TeacherSubject.Subject
    WHERE TeacherSubject.Subject = '数学';

    返事
    0
  • キャンセル返事