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

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について

    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

    まだデーターベースを独学で始めて数ヶ月の初心者です。 以下(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 "; よろしくお願いします。

  • 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つの場合はさらに深刻です。 簡単な記法はないのでしょうか?

その他の回答 (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

  • 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
  • LEFT JOIN の結合結果について

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

  • 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
  • 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
  • inner joinをすると数がおかしくなります

    SQLのinner joinについてお教え下さい。環境はWin 7 MYQL5です。 t1テーブルのデータ ID,在庫 001,22 t2テーブルのデータ ID,出庫 001,17 001,3 SELECT Sum(t1.stock) AS `在庫` FROM t1 where id = '001' 上記SQLの結果は22と表示されます。 SELECT Sum(t1.stock) AS `在庫` FROM t1 INNER JOIN t2 on t1.id = t2.id where id = '001' とやると、結果が44になってしまいます。 なぜそんな結果になってしまうのでしょうか? 結果はt1.stockは在庫22なので、22と表示するようにしたいです。 よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • 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の記述の仕方について

    お世話になっております。 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(+) ;

  • LEFT JOINの使い方

    linkテーブルとcommentテーブルがあります。 下記のようなSQLをPHPから発行すると、 select c.id AS cid, c.pid AS cpid, c.name AS cname, l.id AS id, l.url AS url from comment AS c LEFT JOIN link AS l ON c.pid=l.id order by c.id desc LIMIT 0, 10; $rec['cid'] や $rec['cname'] にはデータがあるのですが $rec['id'] や $rec['url'] にはデータが入っておらずNULLになってしまいます。 ためしに LEFT JOINの左右を下記のように入れ替えみたところ、 select c.id AS cid, c.pid AS cpid, c.name AS cname, l.id AS id, l.url AS url from link AS l JOIN comment AS c LEFT ON c.pid=l.id order by c.id desc LIMIT 0, 10; 今度は $rec['id'] や $rec['url'] にはデータがあるのですが $rec['cid'] や $rec['cname'] にはデータが入っておらずNULLになってしまいました。 どこがおかしいのでしょうか? MYSQLは5.1.22-rcでレンタルサーバーはcoreserverを利用しています。

    • ベストアンサー
    • MySQL