Using a self join/ja
From SQLZoo
Language: | English • 日本語 |
---|
エディンバラのバス: 自己結合
テーブルはそれ自体と結合することができます。この場合、テーブルのインスタンスを区別するための仕組みが必要です。FROM句でラベルを導入することができ、ステートメントの他の部分で使用する際には、ラベルと属性名をドットで区切ります。
routeテーブルでの自己結合の例
(num, company)でのrouteテーブルの自己結合
routeテーブルを(num, company)のペアで結合してみます。その結果、同じ路線サービスを共有するすべての停留所のペアのリストが得られま
SELECT * FROM route R1, route R2 WHERE R1.num=R2.num AND R1.company=R2.company
このテーブルは11,000を超えるエントリーを持つ大きなテーブルです。以下にその一部を示します。LRTの1番サービスだけで121のエントリーがあります。1番の路線には11の停留所があり、これは循環ルートで、最初と最後の停留所は同じです。
num | company | pos | stop | num_1 | company_1 | pos_1 | stop_1 |
---|---|---|---|---|---|---|---|
1 | LRT | 1 | 134 | 1 | LRT | 7 | 217 |
1 | LRT | 1 | 134 | 1 | LRT | 11 | 134 |
1 | LRT | 1 | 134 | 1 | LRT | 10 | 79 |
... | |||||||
1 | LRT | 2 | 97 | 1 | LRT | 7 | 217 |
1 | LRT | 2 | 97 | 1 | LRT | 11 | 134 |
... | |||||||
2 | LRT | 9 | 31 | 2 | LRT | 11 | 217 |
2 | LRT | 9 | 31 | 2 | LRT | 1 | 168 |
... |
路線の停留所の自己結合
routeテーブルをstopフィールドで自己結合することができます。その結果、同じ停留所を共有するすべてのサービスのペアのリストが得られます。
SELECT * FROM route R1, route R2 WHERE R1.stop=R2.stop;
以下の抜粋では、停留所53番「クレイグロックハート」に関するエントリーの一部が示されています。
num | company | pos | stop | num_1 | company_1 | pos_1 | stop_1 |
---|---|---|---|---|---|---|---|
47 | LRT | 4 | 53 | 47 | LRT | 4 | 53 |
47 | LRT | 4 | 53 | 27 | LRT | 6 | 53 |
47 | LRT | 4 | 53 | 10 | LRT | 8 | 53 |
47 | LRT | 4 | 53 | 45 | LRT | 7 | 53 |
47 | LRT | 4 | 53 | 4 | LRT | 6 | 53 |
10 | LRT | 8 | 53 | 47 | LRT | 4 | 53 |
10 | LRT | 8 | 53 | 27 | LRT | 6 | 53 |
10 | LRT | 8 | 53 | 10 | LRT | 8 | 53 |
... |