Aというテーブルがあったとします。
AにはId列のみ
1
2
3
4
というデータが入ってます。
そしてinfoテーブルにはID列とname列が
3 田中
2 高橋
のように入っているとします。
そして下記のようなSQLを実行したとします。
Select a.id,info.name from a,info where a.id=info.id;
これを実行すると
3 田中
2 高橋
が返されるのですが、
1 null
2 高橋
3 田中
4 null
のようなデータが欲しい場合はどうしたらいいのでしょうか?join句を使えばいいのはわかりますが、where句で上記のSQLをどのように並び替えても同じ結果しか表示されませんでした。
where句を使った際のテーブルの結合の優先順位、ロジックなどを交えて教えて欲しいです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
考え方
- 元データ
SQL
1create table A(id int primary key); 2insert into A values(1),(2),(3),(4); 3create table info(id int primary key,name varchar(10)); 4insert into info values(3,'田中'),(2,'高橋');
left join
ご理解いただいていると思いますが普通にやるならleft join
SQL
1select *from A left join info using(id);
joinしない
別にjoinしないでもこうすれば得られます
SQL
1select A.id,(select name from info where A.id=info.id) as name from A
whereで結合
ではwhere句に列記したらなぜとれないのか?
SQL
1select a.id as a_id,info.id as info_id,info.name from a,info;
aとinfoのデータを単純に結合するとこうなってしまうので
nullは発生しません。
a_id | info_id | name |
---|---|---|
1 | 2 | 高橋 |
1 | 3 | 田中 |
2 | 2 | 高橋 |
2 | 3 | 田中 |
3 | 2 | 高橋 |
3 | 3 | 田中 |
4 | 2 | 高橋 |
4 | 3 | 田中 |
これを応用して
SQL
1select a.id,case when a.id=info.id then name else null end as name from a,info
とすれば、以下のようになります
id | name |
---|---|
1 | NULL |
1 | NULL |
2 | 高橋 |
2 | NULL |
3 | NULL |
3 | 田中 |
4 | NULL |
4 | NULL |
これも希望する解とは違います
あえてやるならこう
SQL
1select a.id,group_concat(case when a.id=info.id then name else null end )as name from a,info 2group by id
しかし、こんなことをするくらいなら普通はleft joinで十分です
投稿2019/10/09 00:42
総合スコア116694
0
OUTER JOIN
を使用してください。
sql
1SELECT a.id,info.name 2FROM a 3LEFT OUTER JOIN info 4ON a.id=info.id
投稿2019/10/08 09:57
総合スコア244
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/08 10:20
2019/10/08 10:46
2019/10/08 16:53
0
join句を使えばいいのはわかりますが、where句で上記のSQLをどのように並び替えても同じ結果しか表示されませんでした。
outer joinを使用する事は分っているのですね。
並びは、結合の際のアルゴリズムによって左右される部分がありますが、保証はされないのが普通です。
求めたい結果はID順なので、order byでIDを指定して下さい。
投稿2019/10/08 12:58
編集2019/10/08 13:01総合スコア25327
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
DBMSによって様々なので知ってる範囲で回答します。
Oracleなら外部結合演算子(+)が一応使えます。
https://docs.oracle.com/cd/E16338_01/server.112/b56299/queries006.htm#sthref2254
SQL Serverなら外部結合演算子(=, =)が互換モード90より前なら使えます。
https://docs.microsoft.com/ja-jp/sql/sql-server/install/outer-join-operators-and-are-not-supported-in-90-or-later-compatibility-modes?view=sql-server-2014
これ以外はわかりません。
投稿2019/10/08 10:27
総合スコア7918
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
表示順を指定したいときは ORDER BY 表示したい順のカラム を指定してください。
投稿2019/10/08 09:56
総合スコア16417
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/08 09:57
2019/10/08 10:00
2019/10/08 10:01
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。