SQL
1テーブルA 2|A1|A2| 3|1 |3| 4|2||4| 5テーブルB 6|B1||B2| 7|1||2| 8|3||NULL|
1.```SQL
SELECT A1,A2,B1,B2
FROM A
JOIN B
ON A.A1=B.B1
A1とB1についてはなんとなくわかるんですけど、A2とB2を考えると?ってなります(-_-;) 答えが以下のようになっています。 |A1|A2|B1|B2| |1 |3 ||1 | 2|
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
ベストアンサー
Orlofsky様の回答にあるように、抽象化した例だと理解するのに一苦労ですね。
例として良い悪いがあると思いますが、
『小学校のクラスで同じ苗字のグループを作ってみる』とすると理解の一助となりますでしょうか。
(あくまで例ですので、組内で同じ苗字がないシンプルなデータとします)
1年1組
A1(苗字) | A2(名前) |
---|---|
佐藤 | 太郎 |
鈴木 | 一郎 |
1年2組
B1(苗字) | B2(名前) |
---|---|
佐藤 | 花子 |
高橋 | 健一 |
- 1年1組と1年2組で苗字が同じ生徒を抽出する。
SQLをイメージするまでもなく、以下が『苗字が同じ生徒』の抽出結果ですね。
A1(苗字) | A2(名前) | B1(苗字) | B2(名前) |
---|---|---|---|
佐藤 | 太郎 | 佐藤 | 花子 |
この時、「A1-B1」の関連性は『同じ苗字』ということで関連性が一目で分かりますね。
ただ「A2-B2」だけに着目してしまうと、何かは分かりません。
SELECT句
がデータ抽出した結果のうち、表示(確認)したいデータ項目を指定する部分です。
質問者様の例ですとSELECT A1,A2,B1,B2
となっているため、上記のような抽出結果となります。
SELECT句
(確認したいデータ項目)を変えてみましょうか。
SQL
1SELECT A2,B2 2 FROM A 3 JOIN B 4 ON A.A1=B.B1
- 1年1組と1年2組で苗字が同じ生徒の名前だけを抽出する。
A2(名前) | B2(名前) |
---|---|
太郎 | 花子 |
これだとA2とB2の関係性が、表示された結果からだと分かりづらいですね。
ただし、前提として自分で「1年1組と1年2組で苗字が同じ生徒の名前だけを抽出する。」としているので結果としては正しいかと思います。
ただ、視覚的にも分かりづらいので、以下のようにSELECT句
(確認したいデータ項目)を変えてみましょうか。
- 1年1組と1年2組で苗字が同じ生徒の苗字(1回だけ)と名前だけを抽出する。
SQL
1SELECT A1,A2,B2 2 FROM A 3 JOIN B 4 ON A.A1=B.B1
A1(苗字) | A2(名前) | B2(名前) |
---|---|---|
佐藤 | 太郎 | 花子 |
SQLではこのように、自分が抽出したいデータ項目を柔軟に指定することができます。
『A2とB2を考えると?』とありますが、その部分は「A1とB1が同じデータのそれぞれの一部分」であり、結合条件から言うと意味はありません。
結合した結果として表示させたいデータ項目として指定している、該当データのデータ項目となります。
回答が的を得てないようでしたら、『A2とB2を考えると?』の「?」の部分をどのように感じているか、具体的に記載していただけると、もう少し良い回答がつくかもしれません。
投稿2018/05/03 01:00
総合スコア2335
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
抽出結果が「答え」ってことは、何かの教材ですかね?
であれば、ここではなく、教授?先生?と思われる方に質問者様ご自身が理解できるまで、
直接聞いた方が良いです。
修正依頼出した手前、回答記載しますが、
不明点は教授・先生と思われる方に聞いて下さい。
<テーブルA>
A1 | A2 |
---|---|
1 | 3 |
2 | 4 |
<テーブルB>
B1 | B2 |
---|---|
1 | 2 |
3 | NULL |
<上記テーブルAとテーブルBのデータを基に、結合して求めたい抽出結果(と思われるもの)>
A1 | A2 | B1 | B2 |
---|---|---|---|
1 | 3 | 1 | 2 |
との事なので、求めたい抽出結果(と思われるもの)を抽出するには、以下のようなSQLになります。
SQL
1SELECT A1 2 , A2 3 , B1 4 , B2 5FROM A 6 INNER JOIN B ON( 7 A.A1=B.B1 8 ) 9; 10 11SELECT A.A1 12 , A.A2 13 , B.B1 14 , B.B2 15FROM A 16 LEFT JOIN B ON( 17 A.A1 = B.B1 18 ) 19WHERE A.A1 = 1 20; 21 22SELECT A.A1 23 , A.A2 24 , B.B1 25 , B.B2 26FROM A 27 , B 28WHERE A.A1 = B.B1 29; 30 31SELECT A.A1 32 , A.A2 33 , B.B1 34 , B.B2 35FROM A 36 , B 37WHERE A.A1 = 1 38 AND B.B1 = 1 39; 40 41SELECT TA1.A1 42 , TA1.A2 43 , TA1.A1 as B1 44 , ( 45 SELECT TB2.B2 46 FROM B TB2 47 WHERE TB2.B1 = TA1.A1 48 ) as B2 49FROM A TA1 50WHERE EXISTS( 51 SELECT 'X' 52 FROM B TB1 53 WHERE TB1.B1 = TA1.A1 54 ) 55; 56 57SELECT TA1.A1 58 , TA1.A2 59 , TA1.A1 as B1 60 , ( 61 SELECT TB2.B2 62 FROM B TB2 63 WHERE TB2.B1 = TA1.A1 64 ) as B2 65FROM A TA1 66WHERE TA1.A1 IN ( 67 SELECT TB1.B1 68 FROM B TB1 69 ) 70; 71 72SELECT TA2.A1 73 , TA2.A2 74 , TB2.B1 75 , TB2.B2 76FROM ( 77 SELECT TA1.A1 78 , TA1.A2 79 FROM A TA1 80 WHERE TA1.A1 = 1 81 LIMIT 1 82 ) AS TA2 83 , ( 84 SELECT TB1.B1 85 , TB1.B2 86 FROM B TB1 87 WHERE TB1.B1 = 1 88 LIMIT 1 89 ) AS TB2 90; 91 92SELECT A.A1 93 , A.A2 94 , TB1.B1 95 , TB1.B2 96FROM A 97 , ( 98 SELECT B.B1 99 , B.B2 100 FROM B 101 WHERE B.B1 = 1 102 LIMIT 1 103 ) TB1 104WHERE A.A1 = 1 105; 106 107SELECT TA1.A1 108 , TA1.A2 109 , B.B1 110 , B.B2 111FROM B 112 , ( 113 SELECT A.A1 114 , A.A2 115 FROM A 116 WHERE A.A1 = 1 117 LIMIT 1 118 ) TA1 119WHERE B.B1 = 1 120; 121
動作確認していませんが、上記のSQLは全て「答え」の抽出結果になると思います。
テーブルAとテーブルBにそれぞれ2行ずつしかないのであれば、
無駄なSQL等もありますが、上記全てのSQLの動きを理解出来れば、
A2とB2が???という疑問はなくなると思います。
投稿2018/05/02 13:43
総合スコア760
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。