質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.76%

  • SQL

    2229questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

SQLの結合について

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 198

odgrso

score 22

テーブルA
|A1|A2|
|1 |3|
|2||4|
テーブルB
|B1||B2|
|1||2|
|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|

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • tomari_perform

    2018/05/02 12:30

    テーブルAとテーブルBの例で、抽出した結果、どうなって欲しいかの記述をしてください。

    キャンセル

回答 4

checkベストアンサー

+1

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句(確認したいデータ項目)を変えてみましょうか。

SELECT A2,B2
 FROM A 
 JOIN B
 ON A.A1=B.B1
  • 1年1組と1年2組で苗字が同じ生徒の名前だけを抽出する。
A2(名前) B2(名前)
太郎 花子

これだとA2とB2の関係性が、表示された結果からだと分かりづらいですね。
ただし、前提として自分で「1年1組と1年2組で苗字が同じ生徒の名前だけを抽出する。」としているので結果としては正しいかと思います。

ただ、視覚的にも分かりづらいので、以下のようにSELECT句(確認したいデータ項目)を変えてみましょうか。

  • 1年1組と1年2組で苗字が同じ生徒の苗字(1回だけ)と名前だけを抽出する。
SELECT A1,A2,B2
 FROM A 
 JOIN B
 ON A.A1=B.B1
A1(苗字) A2(名前) B2(名前)
佐藤 太郎 花子

SQLではこのように、自分が抽出したいデータ項目を柔軟に指定することができます。

『A2とB2を考えると?』とありますが、その部分は「A1とB1が同じデータのそれぞれの一部分」であり、結合条件から言うと意味はありません。
結合した結果として表示させたいデータ項目として指定している、該当データのデータ項目となります。

回答が的を得てないようでしたら、『A2とB2を考えると?』の「?」の部分をどのように感じているか、具体的に記載していただけると、もう少し良い回答がつくかもしれません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/04 14:06

    わかりやすすぎて感動しました!
    ありがとうございます!!!

    キャンセル

  • 2018/05/04 17:43

    理解の一助となったようで、何よりです。

    キャンセル

0

抽象化したデータでは質問された方も理解できません。もっと現実に即したデータでなぜ結合したいのか、それも結合するれつが1つで良いのか、2つ必要なのかも明示されては?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

例に出ているクエリの条件では
テーブルAのA1が決まったら、テーブルBのB1もB2も決まるということですよね?
テーブルをあえて分けている理由は、この例ではわかりませんが、
「A1とB1が同じもの」をA2,B2も併せて一つの行にするということです。
難しい説明を見すぎて、わからなくなっているのではないでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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になります。

SELECT    A1
    ,    A2
    ,    B1
    ,    B2
FROM    A
            INNER JOIN B ON(
                A.A1=B.B1
            )
;

SELECT    A.A1
    ,    A.A2
    ,    B.B1
    ,    B.B2
FROM    A
            LEFT JOIN B ON(
                A.A1    = B.B1
            )
WHERE    A.A1    = 1
;

SELECT    A.A1
    ,    A.A2
    ,    B.B1
    ,    B.B2
FROM    A
    ,    B
WHERE    A.A1    = B.B1
;

SELECT    A.A1
    ,    A.A2
    ,    B.B1
    ,    B.B2
FROM    A
    ,    B
WHERE    A.A1    = 1
    AND    B.B1    = 1
;

SELECT    TA1.A1
    ,    TA1.A2
    ,    TA1.A1 as B1
    ,    (
            SELECT    TB2.B2
            FROM    B TB2
            WHERE    TB2.B1    = TA1.A1
        ) as B2
FROM    A TA1
WHERE    EXISTS(
            SELECT    'X'
            FROM    B TB1
            WHERE    TB1.B1    = TA1.A1
        )
;

SELECT    TA1.A1
    ,    TA1.A2
    ,    TA1.A1 as B1
    ,    (
            SELECT    TB2.B2
            FROM    B TB2
            WHERE    TB2.B1    = TA1.A1
        ) as B2
FROM    A TA1
WHERE    TA1.A1 IN    (
                        SELECT    TB1.B1
                        FROM    B TB1
                    )
;

SELECT    TA2.A1
    ,    TA2.A2
    ,    TB2.B1
    ,    TB2.B2
FROM    (
            SELECT    TA1.A1
                ,    TA1.A2
            FROM    A TA1
            WHERE    TA1.A1    = 1
            LIMIT    1
        ) AS TA2
    ,    (
            SELECT    TB1.B1
                ,    TB1.B2
            FROM    B TB1
            WHERE    TB1.B1    = 1
            LIMIT    1
        ) AS TB2
;

SELECT    A.A1
    ,    A.A2
    ,    TB1.B1
    ,    TB1.B2
FROM    A
    ,    (
            SELECT    B.B1
                ,    B.B2
            FROM    B
            WHERE    B.B1 = 1
            LIMIT    1
        ) TB1
WHERE    A.A1    = 1
;

SELECT    TA1.A1
    ,    TA1.A2
    ,    B.B1
    ,    B.B2
FROM    B
    ,    (
            SELECT    A.A1
                ,    A.A2
            FROM    A
            WHERE    A.A1 = 1
            LIMIT    1
        ) TA1
WHERE    B.B1    = 1
;


動作確認していませんが、上記のSQLは全て「答え」の抽出結果になると思います。

テーブルAとテーブルBにそれぞれ2行ずつしかないのであれば、
無駄なSQL等もありますが、上記全てのSQLの動きを理解出来れば、
A2とB2が???という疑問はなくなると思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    日付のデータ横に曜日をインサートしたい

    日付のデータ横に曜日のカラムを足したいのですが、どう記述したらいいでしょうか。 dayofweek() Case文の組み合わせになるのはわかりますが、 うまくいきません。

  • 解決済

    同じカラムのテーブルを探す。

    データベースについて質問です。 複数のテーブルの中で同じ名前のカラムがあるか調べるには どうしたらいいでしょうか? postgreSQL

  • 解決済

    mysql table lock ロックされているか確認

    mysqlでテーブルがロックされているかどうかはクライアントツールでselectしてみたら視覚的にはわかりますが、これをシステム的にチェックする方法はないでしょうか?

  • 受付中

    UPDATE文の副問合せ

    テーブルAのa列と、テーブルBのa列を結合し、 『テーブルAのb列がアで、テーブルBのb列がイの場合、テーブルBのb列をイからアへ更新』というような指示を出したいです。 w

  • 解決済

    Oracle SQLのUPDATE文で希望通りの更新が掛からない

    Oracle初心者です。 【前提】 OracleのViewのテストを行っており、Viewのデータ抽出条件に データ更新年月日(UPDATEYMD)がSYSDATEと同

  • 受付中

    migrate実行時のエラー

    前提・実現したいこと migrateを正常に実行したい。 。 発生している問題・エラーメッセージ rake db:migrateを実行しようとしたところ、 画像のようなメッセ

  • 解決済

    ある条件でカラムの一部のデータを抽出したい

    お世話になっております。 ある条件にそってデータを抽出することは可能でしょうか? 商品名 レタス 野菜 ブロッコリー 野菜 ピーマン 野菜種類 コーラ 飲み物 こういっ

  • 解決済

    MYSQL (phpmyadmin)でのsqlでテーブル名に"-"が入ってある状態の対処

    MYSQL 5.7でphpmyadminを使っております。 テーブル  xxx-bbbtいうテーブル名があるのですが 【テーブル情報】テーブル名: xxx-bbb 項目 id 

同じタグがついた質問を見る

  • SQL

    2229questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。