• 締切済み

SQL 重複しないJoinの仕方を教えてください

データが重複しないSQL文の書き方を教えてください。 下記のような2つのテーブルがあり、「管理番号」でOnして「使用数」をJoinさせ、かつ重複しないようにSQLを作成したいのですが、MySQLで可能でしょうか? ※0002に関しては、テーブル2の方がデータ数が多いため、Join後は2行になって「使用数」は重複せず、「数」の部分には0が入ればベストです 【テーブル1】 日付    品番  管理番号 数 2012/6/12 A987  0001 500 2012/6/14 A987  0001 300 2012/6/16 A987  0001 400 2012/6/18 A987  0001 800 2012/6/12 A987  0002 750 2012/6/12 A987  0003 540 2012/6/14 A987  0003 740 2012/6/16 A987  0003 840 2012/6/18 A987  0003 240 2012/6/20 A987  0003 640 【テーブル2】 日付    品番  管理番号 使用数 2012/7/10 A987  0001 160 2012/7/11 A987  0001 260 2012/7/10 A987  0002 220 2012/7/12 A987  0002 320 2012/7/20 A987  0003 530 2012/7/22 A987  0003 430 2012/7/24 A987  0003 830 【テーブルJoin】 日付    品番  管理番号 数 使用数 2012/6/12 A987  0001 500 160 2012/6/14 A987  0001 300 260 2012/6/16 A987  0001 400 0 2012/6/18 A987  0001 800 0 2012/6/12 A987  0002 750 220 2012/6/12 A987  0002 0 320 2012/6/12 A987  0003 540 530 2012/6/14 A987  0003 740 430 2012/6/16 A987  0003 840 830 2012/6/18 A987  0003 240 0 2012/6/20 A987  0003 640 0

みんなの回答

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

SQLの基本がたぶんわかってないんだろうなぁ・・・という結合です >※0002に関しては、テーブル2の方がデータ数が多いため の箇所はロジックが破綻しているので、表示できるとしても「NULL」です 無理すれば一発でできないことはないですが、テンポラリを作りながらやると解りやすいかも。 //準備 create table テーブル1(日付 date,品番 varchar(10),管理番号 varchar(10),数 int,unique key (日付,管理番号,品番)); insert into テーブル1 values('2012-06-12','A987','0001',500),('2012-06-14','A987','0001',300),('2012-06-16','A987','0001',400),('2012-06-18','A987','0001',800),('2012-06-12','A987','0002',750),('2012-06-12','A987','0003',540),('2012-06-14','A987','0003',740),('2012-06-16','A987','0003',840),('2012-06-18','A987','0003',240),('2012-06-20','A987','0003',640); create table テーブル2(日付 date,品番 varchar(10),管理番号 varchar(10),使用数 int,unique key (日付,管理番号,品番)); insert into テーブル2 values('2012-7-10','A987','0001',160),('2012-7-11','A987','0001',260),('2012-7-10','A987','0002',220),('2012-7-12','A987','0002',320),('2012-7-20','A987','0003',530),('2012-7-22','A987','0003',430),('2012-7-24','A987','0003',830); //抽出SQL create temporary table temp_t1 select (select count(*) +1 from テーブル1 AS t1b where t1a.日付 > t1b.日付 and t1a.管理番号=t1b.管理番号 and t1a.品番=t1b.品番) AS RANK,日付,品番,管理番号,数 FROM テーブル1 AS t1a; create temporary table temp_t2 select (select count(*) +1 from テーブル2 AS t2b where t2a.日付 > t2b.日付 and t2a.管理番号=t2b.管理番号 and t2a.品番=t2b.品番) AS RANK,日付,品番,管理番号,使用数 FROM テーブル2 AS t2a; create temporary table temp_t3 select RANK,管理番号,品番 from temp_t1 union select RANK,管理番号,品番 from temp_t2; //表示部分 select temp_t1.日付 ,temp_t3.品番 ,temp_t3.管理番号 ,coalesce(数,0) as 数 ,coalesce(使用数,0) as 使用数 from temp_t3 left join temp_t1 on temp_t3.RANK=temp_t1.RANK and temp_t3.管理番号=temp_t1.管理番号 and temp_t3.品番=temp_t1.品番 left join temp_t2 on temp_t3.RANK=temp_t2.RANK and temp_t3.管理番号=temp_t2.管理番号 and temp_t3.品番=temp_t2.品番 order by temp_t3.管理番号,temp_t3.RANK

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • SQL LEFT JOIN

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

  • inner joinについて

    SQLのデータ抽出方法についてお教え下さい。 TABLE_2をdistinctで重複を無くして、TABLE_1とinner joinさせたいです。 select distinct TABLE_2.id と select TABLE_1.ID from TABLE_1 inner join distinct TABLE_2.ID といったようなことをやりたいです。 TABLE_1 ID 001 001 002 002 002 TABLE_2 ID 001 001 002 002 002 環境はMYSQL5.5になります。よろしくお願いいたします。

  • 重複せずに取り出すはSQLでできますか?

    アクセス2010です。 テーブルA AB AC DB GR から データの先頭文字だけを重複せずに取り出すには? テーブルB A D G 現在 rs.MoveNextでループを使い1個ずつ同じのがあるか、ないかで取り出していますが、SQL文1行だけで可能でしょうか?

  • 重複項目を取得するSQL分

    SQL分でわからないことがあるので質問させてください。 Aというテーブルに、 番号と処理通番(ユニーク)の2つカラムがあります。 Aテーブルから重複した番号とその処理通番を 上から4件まで取得したいのですが、 ----------------------------- SELECT A.番号,A.処理通番 FROM A INNER JOIN (SELECT 番号 FROM A GROUP BY 番号 HAVING COUNT(*) > 1) AS B ON (A.番号 = B.番号) ORDER BY A.番号,A.処理通番 ----------------------------- のSQLでは重複した番号のデータを 全て取得してしまいます。 番号別に4件まで取得したいのですが、 どのようなSQLを書けば取得できますか? よろしくお願いします。

  • 効率の良いSQL文の書き方を教えてください

    MySQLで開発をしています。 1回のSQLで、下記テーブルの内容を日付・ユーザ番号毎(日付・ユーザ番号が同じ時に同じレコード)に、 型番1個数、 型番2個数、 その他が2か3で型番2・品番1個数、 その他が2か3で型番2・品番1個数、 その他が2か3で型番2・品番1での売上小計、 その他が2か3で型番2・品番2個数での売上小計、 売上合計、 以上の各カラムを持つテーブルに再編して返したいのですが、 効率の良いやり方がわかりません。 どなたかよろしくお願いします。 テーブル ユーザ番号 日付   型番  品番   売上  その他 ----- --- --- --- --- ---  001     3/10    1    2     500    1  001     3/10    2    1      0    1  003     3/11    2    1     100    2  004     3/12    1    1     100    2  005     3/12    2    2      0     2  001     3/13    1    2     500    1  003     3/13    2    1     100    2  003     3/13    2    1      0     3  002     3/14    1    1     100    3  005     3/15    2    2     0      1

  • 重複しないデータの抽出について

    MYSQL5.0.77で DBをつくり テーブル1のAフィールドのデータから テーブル2のAフィールドのデータ、 テーブル3のAフィールドのデータ、 テーブル3のAフィールドのデータ、 のいずれにも重複しないデータのみ 抽出したいと思っています。 どのようなSQL文を書けばよいでしょうか? じぶんでいろいろ試しましたがどうしても出来ません。 どなたかご教授願います。

    • ベストアンサー
    • MySQL
  • SQL(初心者です) 3つのテーブルを結合

    下のような3つのテーブルを結合したいのですが SQL1つで可能でしょうか? 条件は 1.品種機械テーブルを読み込みます。 品種でユニークしますが使用日付を降順にならべ変えます。品種機械テーブルから使用日付がMAXのものの行データをすべて取得(下の場合:A 4 20051204・・)ほかはいりません。 2.品種テーブル読み込む。 1で取得した品種と一致する行データをすべて取得 3.機械テーブルを読み込む 2で取得した機械と一致する行データをすべて取得 うまい方法がおもいつかないのでアドバイスや 参考になりそうなホームページなどありましたら教えていただけないでしょうか? 宜しくお願いします。 --------------------------------------------- (1)品種テーブル(品種を管理) 品種  ・・・etc A   B C D --------------------------------------------- (2)機械テーブル(機械を管理) マシン ・・・etc 1 2 3 4 ------------------------------------------ (3)品種機械テーブル(品種と機械を管理) 品種 | マシン | 使用日付 |・・・etc A | 1 | 20051201 A | 2 | 20051202 A | 3 | 20051203 A | 4 | 20051204

  • 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件でした・・・

  • ACCESS2007で、重複チェックSQL文改編

    ACCESS2007で、重複チェックのSQL文の改編方法について教えてください。 ●フィールド内容=|会社名|郵便番号|住所|電話番号|業種| テーブル1とテーブル2を比較して、この内、|電話番号|が (1)両テーブルに存在する= SELECT テーブル1.* FROM テーブル1 INNER JOIN テーブル2 ON テーブル1.電話番号=テーブル2.電話番号; (2)テーブル1のみに存在する= SELECT テーブル1.* FROM テーブル1 LEFT JOIN テーブル2 ON テーブル1.電話番号=テーブル2.電話番号 WHERE (((テーブル2.電話番号) Is Null)); (3)テーブル2のみに存在する= SELECT テーブル2.* FROM テーブル1 RIGHT JOIN テーブル2 ON テーブル1.電話番号=テーブル2.電話番号 WHERE (((テーブル1.電話番号) Is Null)); 場合のSQL文が上記なのですが、この条件を |会社名|と|電話番号|の両方が一致する時(1a)(2a)(3a) と |会社名|と|電話番号|のどちらか一つが一致する時(1b)(2b)(3b) にソース改変するにはどうしたら良いでしょうか?(AND、ORを使うのだと思いますが、具体的配置位置が分かりません。。) PS1:この程度の事ならSQL文を書かずとも、ウィザードで処理できるのでしょうか? PS2:テーブル名が、[テーブル]とカッコ有る無し両パターン見ますが、どちらが正解なのでしょうか? PS3:SQL文内は、ワード間は、半角スペースに統一されているんでしょうか?それともスペース無しでもエラーは出ないんでしょうか?

  • SQLで、重複レコードを削除

    no type name ---------------------------- 1 1 peach 1 1 peach 2 5 tomato 4 6 apple 4 6 apple 1 1 peach  上記のように、重複するレコード(行)が存在してしまっているテーブルで、重複をなくす処理を、SQLで簡単に行なうにはどうしたら良いでしょうか。MySQLです。上の例では、下のように更新したいのです。よろしくお願いします。 no type name ---------------------------- 1 1 peach 2 5 tomato 4 6 apple

    • ベストアンサー
    • MySQL
このQ&Aのポイント
  • スキャナーを使ってもパソコンに画像が送られない。ファイヤーウォールのレベルの問題のようなことが書いてある。ノートン360を開いてもどこをどうしていいか分かりません。
  • MFC-J6983CDWを使用している際、スキャナー画像がパソコンで受け取れないトラブルが発生しています。ファイヤーウォールの設定に問題があるようで、特にノートン360の設定に問題があるようです。
  • 質問者はMFC-J6983CDWを使用しており、スキャナーを使ってもパソコンに画像が送られない問題に直面しています。ファイヤーウォールのレベルの問題が原因であり、ノートン360の設定方法が分からない状況です。
回答を見る