2016-04-11 5 views
0

私はPostgreSQLを使用しています。私はこのクエリで設定し、この結果を得ることができますSQLで多くの関係を解決する

Results 
student_name | biology | math 
     John |  abc | def 
     Jane |  zxc | NULL 

SELECT 
    student.name as student_name, 
    biology.registration_token as biology, 
    math.registration_token as math 
FROM 
    Students 
LEFT JOIN (
    SELECT registration_token FROM Student_Classes WHERE class_id = (
    SELECT id FROM Classes WHERE name = 'Biology' 
    ) 
) AS biology 
    ON Students.id = biology.student_id 
LEFT JOIN (
    SELECT registration_token FROM Student_Classes WHERE class_id = (
    SELECT id FROM Classes WHERE name = 'Math' 
    ) 
) AS math 
    ON Students.id = math.student_id 

がですが、私はこのような結果セットを取得したい

Classes 
id | name 
1 | Biology 
2 | Math 


Students 
id | name 
1 | John 
2 | Jane 


Student_Classes 
id | student_id | class_id | registration_token 
1 |   1 |  1 |    abc 
2 |   1 |  2 |    def 
3 |   2 |  1 |    zxc 

:のは、私は3つのテーブルがあるとしましょう各クラスの結合ステートメントを持たずに同じ結果セットを得る方法?このソリューションでは、クラスを追加したい場合は、別のjoinステートメントを追加する必要があります。

+0

RDBMSでは関係が制約によって維持されていますが、関連するテーブルとジョインするときに関係が実際に意味をなされるので、あなたは 'Join'を使う必要があると思います。あなたのケースでは、より良いスケーラビリティのためにあなたの方法でテーブルを設計する方が良いです。はい、新しいテーブルを追加する必要がある場合は、参加を続けるのが面倒です。実装する前にテーブルの設計を見直してみてください。しかし、リレーショナルデータベース理論があなたに与えるものを受け入れます。 – Rugal

+0

[refcursors](http://www.postgresql.org/docs/current/static/plpgsql-cursors.html#AEN63396)から[構築](http://www.postgresql.org/docs/current/static/plpgsql-cursors.html#AEN63237)実行時にクエリを実行します。 – Abelisto

答えて

1

これはpostgresql tablefunc拡張クロスタブで行うことができますが、このようなプレゼンテーション要件はsqlの外部でよりよく処理される可能性があります。