テーブル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
こうなるようにしたい。
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件
回答3件
あなたの回答
tips
プレビュー