テーブル "ab"に、クラス "a"とクラス "b"から取得する生徒の名前があり、同様にテーブル "ac"と "bc"があるとします。グループを構成できる学生(つまり「一緒に行こう」)のすべての組み合わせを可能にするために、どのようなSQLクエリを使用する必要がありますか?そして、これをどのようにn個のクラスに拡張できますか? 例:クラスaのJohnは、クラスbのJenとクラスcのSteff、そしてJenとSteffが一緒になります。したがって、John、Jen、Steffはグループを形成することができます)。SQLテーブルを結合する
答えて
このクエリは、ので1つのグループに属することができるすべての生徒を返す必要があります。
WITH ABC AS (SELECT AB.A, AB.B, AC.C FROM (SELECT * FROM AB
INNER JOIN BC
ON AB.B=BC.B)
INNER JOIN AC
ON (AC.C=BC.C AND AB.A=AC.A))
SELECT STUDENT FROM (
SELECT AB.B STUDENT FROM ABC WHERE AB.A='John'
UNION
SELECT AC.C STUDENT FROM ABC WHERE AB.A='John')
GROUP BY STUDENT
PS:任意の構文チェックせずに高速で書かれ、あなたが動作するようにこれを持参することができます願っています:)このため
私は2つのテーブル、学生テーブル(ID、名前を作成し、クラス)と関係テーブル(student1、student2)を含む。クラスの時間、場所などのクラステーブルを追加することもできます。
友情には2つの関係(2,3)と(3,2)の2つの関係があります。 1つの方法は、他の生徒のフォロワーまたはファンかもしれません。 これは3つ以上のクラスに拡張されます。
次に、複数の結合を使用して、友人などの友人を任意の深さにすることができます。ここで
は、友人の友人(FOF)を取得するためのクエリです:
SELECT fof_details.*
FROM relationships r
INNER JOIN relationships fof
ON r.student2 = fof.student1
INNER JOIN student fof_details
ON fof_details.id = fof.student2
WHERE r.student1 = '12';
は次のようにグラフのモデリングを行うために特別に作られたデータベースエンジンもあります。
最初のクエリは、追加の3
に参加すると、同じクエリになりselect ab.a, ab.b, ac.c
from
ab inner join
bc on ab.b = bc.b inner join
ac on ac.a = ab.a and bc.c = ac.c
は、n個のクラスにステップアップすると、N = 4のように、徐々により複雑な取得するコードによって満足することができます
inner join ad on ab.a = ad.a
inner join bd on bd.b = ab.b and ad.d = bd.d
inner join cd on cd.c = ac.c and ad.d = cd.d
2クラスは
3のクラスは、3つのテーブルが必要、1つのテーブルを必要とせず、全く参加しますND 2加わり、
4クラスは6つのテーブルを必要とし、5は
に参加するので、我々はそれが我々が
ファーストを進めるよう、各クラス用のテーブルを持っている必要はありません、徐々に、より複雑になっ見ることができます。複数のテーブルで同じタイプの情報をキャプチャしていますが、これは一般的に悪い習慣とみなされます。同じデータが1か所に存在するようにデータを「正規化」する必要があります。
次に、実際にビルドしようとしていることを理解できるように、テーブルに適切な名前を付けます。多分あなたは、実際の実装の意図が "質問"に "ab"を使用することによってマスクされていることを一般化していますが、実際のコードでこれを実行していると、長期的にあなたを傷つけるでしょう。
あなたの名前とあなたと友人が誰であるかを追跡友人テーブルを持つ人々のテーブルが必要に表示されます。
create table people (id int, name char(128));
create table friends (id int, person_id int, friend_id int);
次に、あなただけのグループを取得するクエリを持っている必要があります:
SELECT person.* FROM friends
INNER JOIN friends grp
ON friends.friend_id = grp.person_id
INNER JOIN people person
ON person.id = grp.friend_id
WHERE friends.person_id = 42;
- 1. SQL結合テーブル
- 2. SQL結合4テーブル
- 3. 3テーブルSQLを結合
- 4. 複数のテーブルを結合するSQL
- 5. テーブルを結合するSQL Server
- 6. 複数のSQLテーブルを結合する
- 7. 3つのテーブルを結合するSQL
- 8. テーブル、クエリSQLを結合する方法
- 9. メモリ内のSQLテーブルを結合する
- 10. テーブルを結合するsql windowsフォーム
- 11. 4つのテーブルを結合するSQL
- 12. SQLクエリの結合テーブル
- 13. SQL結合テーブルとMIN句
- 14. SQL Serverの結合テーブル
- 15. SQL - 複数のテーブル結合
- 16. SQL内部結合2テーブル
- 17. テーブル間のSQL右結合
- 18. SQLデータベースの結合テーブル
- 19. 結合する同じ列のSQLテーブル
- 20. SQL結合テーブルに対するDistinct値
- 21. SQL 3つのテーブルで結合する
- 22. SQL Server - テーブル結合時のグループ連結
- 23. 各テーブルのSQLへのSQL結合
- 24. SQL - 内部結合テーブルの複合インデックス?
- 25. SQLテーブルを結合しますが、結合テーブルの追加情報付き
- 26. SQL Serverの結果を別のテーブルと結合する
- 27. Temp列の結果をテーブルに結合するSQL Server
- 28. 結合テーブルを結合するRailsモデル
- 29. 結合テーブルのフィールドを結合する
- 30. SQLの行を結合する結合
悪いスキーマ設計のようです。 –
+1 @マークバイヤーズ - 合意しました! – exodream