質問するログイン新規登録

Q&A

解決済

3回答

124405閲覧

joinで結合したテーブルの片方に複数レコードがある場合に、レコードが複数とれてしまう場合の対応について

GiveAHand

総合スコア286

SQL

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

0グッド

2クリップ

投稿2016/11/21 04:07

0

2

テーブルAとテーブルBをjoinで結合した場合、結合条件にあうデータが、テーブルBに複数存在する場合、結果が複数になってしまいます。

これをテーブルAの数分だけにするに、どうしたらいいのでしょうか?

ちなみに問題のSQLはこのようなものです。

SQL

1select 項目1, 項目2 2from テーブルA dg 3join テーブルB 4on テーブルA.項目1 = テーブルB.項目1 5and テーブルA.項目2 = テーブルB.項目2

テーブルA
項目1 項目2
aaa1 aaa2
bbb1 bbb2

テーブルB
項目1 項目2
aaa1 aaa2
aaa1 aaa2
ccc1 ccc2

結果
項目1 項目2
aaa1 aaa2
aaa1 aaa2

これを、

結果
項目1 項目2
aaa1 aaa2

こうなるようにしたい。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

NipponNo

2025/11/04 08:55 編集

1対多でご苦労しているプロジェクトが行き詰った経験があります。 1.「テーブルAの全データの内、テーブルBに存在するものだけを絞り込み条件として    テーブルAだけの抽出を行いたいということ」 2.「テーブルAとテーブルBをクロスjoinすること」 上記1.と2.は一見してあたかも同じことをしているように見えて 全く違うことをしています。 Distinctする解決方法は一時的によく見えても見せかけのことになってしまいます。 果たして本当にDistinctしてしまっていいのか?本来の目的が何がしたかったのか疑問を感じます。 例えば、もしもテーブルAとテーブルBをMergeするのであればどちらを生かして上書きするのか? それとも両方とも生かすのか?何がしたいデータなのかをご確認いただき必要なクリーニングを すべきかもしれないと思いました。 ちなみに私が関わった1対多は配列の大きさが変わる度に配列のサイズを変えるプログラム改修をしていて 動的配列にしていませんでしたが最終的にはJAVAアプリ、もしくは、VB.NETアプリがお蔵入りとなり、 お客様の慣れているEXCELで検索更新する場合に全削除と全新規作成をする作りにしました。 難しいSQLを考えることを捨てる勇気で、別々に影響しあう、トリガーすることも ベストセレクトかもしれません。1つのSQLでは出来ないこと(不可能なこと)もあるのだと しかし、こうすれば要件は満たせると別の案を提供することもエンジニアの実力だと思います。 項目1 項目2  テーブルA件数 テーブルB件数 aaa1 aaa2  1件      2件 bbb1 bbb2  1件      0件 ccc1 ccc2  0件      1件
guest

回答3

0

ベストアンサー

SELECTの項目がテーブルAのみであるならば

sql

1select distinct テーブルA.項目1, テーブルA.項目2 2from テーブルA dg 3join テーブルB 4on テーブルA.項目1 = テーブルB.項目1 5and テーブルA.項目2 = テーブルB.項目2

投稿2016/11/21 04:14

A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

GiveAHand

2016/11/21 04:19

A.Ichi様 うまくいきました! ありがとうございました!
guest

0

SQL

1select 項目1, 項目2 2from テーブルA dg 3join テーブルB 4on テーブルA.項目1 = テーブルB.項目1 5and テーブルA.項目2 = テーブルB.項目2 6-- 以下を追加する 7group by テーブルA.項目1

注意点としてどちらが紐づくかは分かりません。
MySQLでは大抵紐付いた上から1レコード目のデータのみがとれます。


別解

SQL

1select distinct 項目1, 項目2 2from テーブルA dg 3join テーブルB 4on テーブルA.項目1 = テーブルB.項目1 5and テーブルA.項目2 = テーブルB.項目2

投稿2016/11/21 04:14

miyabi-sun

総合スコア21556

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

GiveAHand

2016/11/21 04:21

miyabi-sun様 ご回答ありがとうございます! あと、別解はうまくいきましたが、 一つ目の解は、 ORA-00979: not a GROUP BY expression というエラーが出てうまくいきませんでした(>_<)
guest

0

本来、集合の積ですから複数行になるのは当然です。

単に重複行を削除したいなら、

SQL

1SELECT DISTINCT 項目1,項目2 2...

と、DISTINCT 句を指定すれば結果から重複する行は除かれますが、そもそもテーブルA自体に重複行があった場合は、これではテーブルAの行数とは一致しなくなります。

投稿2016/11/21 04:28

tacsheaven

総合スコア13707

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.29%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問