• ベストアンサー
  • 困ってます

SQL LEFT JOIN

SQLでわからないことがあるので質問させていただきます。 例えばの話ですが在庫テーブルというテーブルがあってそこに商品マスタ をLEFT JOINする際に SELECT *  FROM 在庫テーブル LEFT JOIN 商品マスタ ON 品番 = 品番 として実行すると返ってくる結果は在庫テーブルの全レコードと 品番で結んだ商品マスタに存在するデータってことですか? 上記のSQLと SELECT * FROM 在庫テーブル で返ってくるレコード件数が違うという時はどういう可能性が考えられるでしょうか? ちなみに商品マスタの品番レコードはすべてユニークになっていて 色やサイズで品番が複数存在するものではありません。 何回やってもレコード件数が前者のほうが多くなってしまいます。 分かる方がいらしたらぜひ教えていただきたいです。

共感・応援の気持ちを伝えよう!

  • 回答数4
  • 閲覧数1592
  • ありがとう数5

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.4
  • ks0902
  • ベストアンサー率85% (6/7)

もしかすると、「ON」で条件を指定する際、 テーブルの指定をしてないんじゃないですか? <例1> SELECT * FROM 在庫テーブル LEFT JOIN 商品マスタ ON 在庫テーブル.品番 = 商品マスタ.品番; または <例2> SELECT * FROM 在庫テーブル A LEFT JOIN 商品マスタ B ON A.品番 = B.品番;

共感・感謝の気持ちを伝えよう!

質問者からのお礼

回答ありがとうございます。 無事解決できました。

関連するQ&A

  • 少し複雑な left join

    まだデーターベースを独学で始めて数ヶ月の初心者です。 以下(3行目のleft join)の記述では動かないのですが、どのように 記述したらよいのでしょうか? やりたい内容は3行目にあるようにbookedというテーブルの中のdateが 2013-06-05だけ抽出した形のテーブルを、timeTplというテーブルとleft join させたいです。 1 "select * 2 from 3 timeTpl as t left join (SELECT * FROM booked where date ="2013-06-05") as b 4 on 5 t.start >= b.startTime and t.start < b.finishTime || 6 t.finish > b.startTime and t.finish <= b.finishTime 7 where 8 t.time > 9 (select start 10 from class as c left join member as m 11 on c.className = m.class 12 where m.name = '$name') 13 ) 14 "; よろしくお願いします。

  • inner joinでサブクエリ

    SQLについてお教え頂けませんでしょうか? 在庫テーブル ・ID ・数量 データ 001,1 001,3 002,3 002,2 002,4 003,2 商品テーブル ・ID データ 001 002 003 004 やりたいこと: 在庫テーブルには重複しているIDがあります。 商品テーブルには重複しているIDはありません。 在庫テーブルの重複を削除したIDと商品テーブルのIDをinner joinで結びたいと思います。 ・select distinct ID FROM 在庫テーブル ・select ID FROM 商品テーブル この2つのjoin方法がわかりません。 結果として、 001 002 003 を取得したいいです。宜しくお願いします。 ちなみに select ID from 商品テーブル inner join 在庫テーブル 商品テーブル.ID = exists(select distinct ID from 在庫テーブル) というコードを書きましたが、動きませんでした・・・抽出データが0件でした・・・

  • LEFT JOINが2つあるSQL文でANDの意味

    ■下記SQL文の意味を教えてください SELECT a.*, b.being_name FROM alive a  LEFT JOIN being b ON a.hoge_id = b.id  LEFT JOIN call c ON c.call_id = a.hoge_id   AND f.hoge_id = 12  WHERE f.hoge_id = 12 OR b.id = 12 ※12の部分は動的に切り替わります ・LEFT JOINが2つあるので、3つのテーブルを結合しているのでしょうか? ・左テーブルは「alive a」で、この右側に2つのテーブルが結合している、という認識でよいでしょうか? >SELECT フィールド名 FROM テーブル名 WHERE 条件式1 AND 条件式2 >「AND」は2つの条件式の論理積 ・上記内容をネットで見かけたのですが、「AND」は、「WHERE」の前に来てもいいのでしょうか? それともこのSQLの「AND」は違う使い方をしているのでしょうか? 何か、LEFT JOINに関係しているのでしょうか?

    • ベストアンサー
    • MySQL

その他の回答 (3)

  • 回答No.3
  • ks0902
  • ベストアンサー率85% (6/7)

またまたすみません。先程の修正は間違いです・・・ 最初の回答を確認してみて下さい。

共感・感謝の気持ちを伝えよう!

  • 回答No.2
  • ks0902
  • ベストアンサー率85% (6/7)

すみません先程の回答を修正します。 >SELECT *  >FROM 在庫テーブル LEFT JOIN 商品マスタ >ON 品番 = 品番 > >として実行すると返ってくる結果は在庫テーブルの全レコードと >品番で結んだ商品マスタに存在するデータってことですか? 商品マスタの品番が重複していなければ、 在庫テーブルの全レコードと品番で結んだ 商品マスタに存在するデータを取得できるはずです。 まずは商品マスタの品番が重複していないこと(1)、(2)の select文を実行して確認して下さい。 (1)select count(品番) as 件数 from 商品マスタ; (2)select sum(件数) as 件数 from (select count(品番) as 件数 from 商品マスタ group by 品番); (1)、(2)共に件数は同一でしょうか?

共感・感謝の気持ちを伝えよう!

  • 回答No.1
  • ks0902
  • ベストアンサー率85% (6/7)

>SELECT *  >FROM 在庫テーブル LEFT JOIN 商品マスタ >ON 品番 = 品番 > >として実行すると返ってくる結果は在庫テーブルの全レコードと >品番で結んだ商品マスタに存在するデータってことですか? 商品マスタの品番が重複していなければ、 在庫テーブルの全レコードと品番で結んだ 商品マスタに存在するデータを取得できるはずです。 まずは商品マスタの品番が重複していないこと(1)、(2)の select文を実行して確認して下さい。 (1)select count(品番) from 商品マスタ; (2)select count(品番) from (select 品番 from 商品マスタ group by 品番); (1)、(2)共にcount数は同一でしょうか?

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • Left Joinについて

    Left Joinについて select * From shohin left join meisho on sh03 = me02 and me01 = 1 where **** select * From shohin left join meisho on sh03 = me02 where me01 = 1 left joinの中に me01 = 1があるパターンとwhere句に me01 = 1 があるパターンで検索結果が変わってくる具体的にどう変わるのでしょうか 良く理解ができていないので教えてください

  • LEFT JOIN の結合結果について

    お世話になります。 ”SELECT Aテーブル.* Bテーブル.*  FROM Aテーブル LEFT JOIN Bテーブル ON Aテーブル.KEY = Bテーブル.KEY”を 行った場合、Aテーブルにしか存在しないデータのBテーブル側の値は常にNULLに なるようなのですが、この場合ゼロを固定に設定することは出来ないでしょうか? よろしくお願いします。 ※ORACLE 9i、PL/SQL上での処理を考えています

  • sql(left join)の結合条件のルール

    (テーブルA)と(テーブルB)をleft joinした際の結合条件について 詳しい方に伺いたいのですが、 on以下の部分は、(テーブルAの中にあるカラム)と(テーブルBの中にあるカラム)を 比較するような文でなければいけないですか? 例えば、、、 ------------------------------------------------------------------------- SELECT * FROM  timeTpl2 AS t LEFT JOIN booked AS b ON  t.start = b.startTime AND  b.settingDay = $day ------------------------------------------------------------------------- 上記の最後の部分(b.settingDay = $day)は テーブルbにしかない要素を変数($day)と比較しています。 ◆疑問 記述としてだいじょうぶかどうかを知りたいです。 つまりon以下結合条件は必ず左右のテーブルの、存在するカラム のみしか比較する事ができないかどうかが知りたいです。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • LEFT JOINとRIGHT JOINについて

    SQL初心者です。 基本的な質問ですみません、教えてください。 LEFT JOINとRIGHT JOINについて、どちらのテーブルを左側、どちらのテーブルを右側にするのかが分かっていません。どういう基準で左側、どういう基準で右側と考えれてばいいのでしょうか? 宜しくお願いします。

  • LEFT JOINを多用するのはよくないですか?

    PHP4+MySQL4.0 http://oshiete1.goo.ne.jp/kotaeru.php3?q=2085277 の続きなのですが、同質問にご回答下さったsaintandreさんのSQL例文を 拡張して、下記のように2年分(24か月=24行)をLEFT JOINしようとしたら、 phpMyAdmin上でSQL文を発行しても結果がなかなか返ってこなかったり PHP4で簡単なHTMLリストを書き出すプログラムをIE6上で実行しても 途中で「ページがみつかりません」になったりで、結果が得られないことの方が 多いです。SQL文1本で強引に解決することはあきらめたほうがよいでしょうか。 画期的な解決策がもしあればご教示ください。 SELECT `社員マスター`.`社員ID` AS `名前ID` ,`社員マスター`.`名前` AS `名前` ,`社員マスター`.`性別` AS `性別` ,`出席日数200601`.`出席日数` AS `出席日数200601` ,`出席日数200602`.`出席日数` AS `出席日数200602`    :  (…途中20か月分・略…)    : ,`出席日数200611`.`出席日数` AS `出席日数200611` ,`出席日数200712`.`出席日数` AS `出席日数200712` FROM `社員マスター` LEFT JOIN `出席テーブル` AS `出席日数200601` ON `社員マスター`.`社員ID` = `出席日数200601`.`社員ID` AND `出席日数200601`.`年月` = '200601' LEFT JOIN `出席テーブル` AS `出席日数200602` ON `社員マスター`.`社員ID` = `出席日数200602`.`社員ID` AND `出席日数200602`.`年月` = '200602'    :  (…途中20か月分・略…)    : LEFT JOIN `出席テーブル` AS `出席日数200711` ON `社員マスター`.`社員ID` = `出席日数200711`.`社員ID` AND `出席日数200711`.`年月` = '200711' LEFT JOIN `出席テーブル` AS `出席日数200712` ON `社員マスター`.`社員ID` = `出席日数200712`.`社員ID` AND `出席日数200712`.`年月` = '200712'

    • ベストアンサー
    • MySQL
  • LEFT JOINの記述の仕方について

    お世話になっております。 LEFT JOINの記述の仕方でご確認したい事があります。 ご教授頂けますようお願いいたします。 【ご質問内容】 以下のようなSQLをLEFT JOINを使用して記述する場合、 どのように記述すればよろしいのでしょうか? SELECT A.* FROM A B C WHERE A.COLUMN1 = B.COLUMN1 AND B.COLUMN2 = C.COLUMN2(+) AND B.COLUMN3 = C.COLUMN3(+) AND A.COLUMN4 = C.COLUMN4(+) ;

  • MySQLでLEFT JOIN

    MySQL4.0.26でテーブルの左外部結合がしたいです。 左テーブルAと 右テーブルBをWHERE句で抽出したもの を結合することはできないのでしょうか? 考えた以下の式ではエラーが出てしまいます。 SELECT * FROM A LEFT JOIN ( SELECT * B WHERE id = 1 ) AS B2 ON A.id = B2.id

    • ベストアンサー
    • MySQL
  • 複雑なSQLを1本でまとめたい

    Oracle10gで開発をしています。 1本のSQLで下記のような結果を返したいのですが、 やり方がわかりません。 どなたかご教授頂けないでしょうか? Aテーブル No  注文番号 品番 在庫数 注文数 -  ---- -- --- --- 1   001   a001  10    0 2   002   a001  5     5 3   003   b001  10    10 4   004   c001  5     2 5   005   d001  20    0 SELECT * FROM Aテーブル WHERE 在庫数 - 注文数 > 0 結果 No  注文番号 品番 在庫数 注文数 -  ---- -- --- --- 1   001   a001  10    0 4   004   c001  5     2 5   005   d001  20    0 となりますが、 これを 結果 No  注文番号 品番 在庫数 注文数 -  ---- -- --- --- 1   001   a001  10    0 2   002   a001  5     5 4   004   c001  5     2 5   005   d001  20    0 という風に、1番目の結果+1番目の結果にある商品の 他レコードも抽出したいのですが、どうしたらよいでしょうか?

  • left join が3つ以上のとき

    例えば select * from ((t1 left join t2 on t1.a=t2.a)left join t3 on t1.a=t3.a) where b.t1='y'; という風にカッコがついて記入しにくくなります。 4つの場合はさらに深刻です。 簡単な記法はないのでしょうか?

  • サブクエリ同士をLEFT JOIN

    select SUB1.品番, SUB1.在庫計上セクション, SUB1.倉庫, SUB1.場所, SUB1.在庫数, SUB2.売価変更日付, SUB2.売変単価 from (select 在庫管理RF.在庫計上セクション as 在庫計上セクション , 在庫管理RF.倉庫 as 倉庫, 在庫管理RF.場所 as 場所, 在庫管理RF.品番 as 品番, sum(在庫管理RF.フリー在庫数) as 在庫数 from 在庫管理RF where フリー在庫数 > 0 group by 在庫管理RF.在庫計上セクション, 在庫管理RF.倉庫, 在庫管理RF.場所, 在庫管理RF.品番) SUB1 left join (select 売価変更確定RF.品番 as 品番, max(売価変更確定RF.売価変更日付) as 売価変更日付, min(売価変更確定RF.売変単価) as 売変単価 from 売価変更確定RF group by 売価変更確定RF.品番) SUB2 上記のSQL文が実行できません。 どこがいけないのかもわかりません。 どなたか詳しい方がいればアドバイスお願いします。 使っているTOOLはOSqlEditです。 ACCESSのクエリデザインで同じようにサブクエリを使って実行すると うまくいきます。 よろしくお願いします。