SQLの記述方法に関して、教えてください。
以下のような二つのテーブルがあるとします。table1には、担当のIDが記載されていて、
table2には担当のIDと名前が記載されています。
id,tanto1,tanto2
1,2,3
2,3,4
3,1,2
tid,name
1,山田
2,佐藤
3,河口
4,鈴木
これを以下のような形で表示させるには、どのようなSQLを書けばよいのでしょうか。
id,name1,name2
1,佐藤,河口
2,河口,鈴木
3,山田,佐藤
初歩の初歩の質問で申し訳ありませんが、宜しくお願いします。
SELECT table1.id
, (select table2.name from table2 where table2.tid = table1.tanto1)
, (select table2.name from table2 where table2.tid = table1.tanto2)
FROM table1
それぞれ 抽出したデータで 再度 SELECT してやればいいです。
select a.id, b.name, c.name from table1 a , table2 b , table2 c where a.tanto1 = b.id and a.tanto2 = c.id
select a.id , (select b.name from table2 b where a.tanto1 = b.id) , (select c.name from table2 c where a.tanto2 = c.id) from table1 a
2種類の方法があるんですね。ありがとうございます。
RDBMSにもよるが例えばPostgreSQLなら下記などになる。
別のRDBMSの場合は、返信欄に名称とバージョンを明記して他の回答者からの回答を待つよろし。
CREATE TEMPORARY TABLE table1 (id INT, tanto1 INT, tanto2 INT); INSERT INTO table1 VALUES(1,2,3),(2,3,4),(3,1,2); CREATE TEMPORARY TABLE table2 (tid INT, name TEXT); INSERT INTO table2 VALUES(1,'山田'),(2,'佐藤'),(3,'河口'),(4,'鈴木'); SELECT a.id , (SELECT b.name FROM table2 b WHERE b.tid = a.tanto1 LIMIT 1) AS name1 , (SELECT c.name FROM table2 c WHERE c.tid = a.tanto2 LIMIT 1) AS name2 FROM table1 a;
MYSQL を利用していました。教えていただいた考え方で対応できました!
table1にある担当者IDが、table2にない場合に、その行を取得するかどうかで、2通りの書き方がありますので、2通りのSQLを示します。
その行を除外する場合は内部結合、担当者を空白としてその行を取得する場合は外部結合を用います。
いずれの場合も、ひとつのSQLにtable2を2回登場させるのが気づきにくい点かと思います。
--内部結合 select t1.id , t2_1.name name1 , t2_2.name name2 from table1 t1 , table2 t2_1 , table2 t2_2 where t1.tanto1 = t2_1.tid and t1.tanto2 = t2_2.tid order by t1.id --外部結合 select t1.id , t2_1.name name1 , t2_2.name name2 from table1 t1 left outer join table2 t2_1 on (t1.tanto1 = t2_1.tid) left outer join table2 t2_2 on (t1.tanto2 = t2_2.tid) order by t1.id
ありがとうございました。我流でやっていると外部結合、内部結合、どうしても理解できません。。。。
ありがとうございます!
なるほど勉強になります。