- ベストアンサー
Null同士の結合
お力貸してください。 [Table111] データA データB データC Name111 Null 1 5 あああ 2 Null 6 いいい 3 4 7 ううう [Table222] データA データB データC Name222 Null 1 5 AAA 2 Null 6 BBB 3 4 7 CCC Table111とtable222をデータAとデータBとデーターCの3つで結合して 新しいテーブルをつくりたいです。 [TableC] データA データB データC Name111 Nam222 Null 1 5 あああ AAA 2 Null 6 いいい BBB 3 4 7 ううう CCC Nullもデーターとして認識させたいのですが、うまくいきません。 できれば、新しくテーブルを作ったりしたくないです。 お知恵をかしてください。よろしくおねがいします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
#1です。 >X・Yというのは? Table111 AS X Table222 AS Y Table111 に別名 X と付けています。 同様に Table222 に Y という別名をつけてます。 別名を使わなかった場合は下のようになります。 SELECT Table111.データA, Table111.データB, Table111.データC, Table111.Name111, Table222.Name222 INTO TableC FROM Table111 INNER JOIN Table222 ON ("" & Table111.データA = "" & Table222.データA) AND ("" & Table111.データB = "" & Table222.データB) AND ("" & Table111.データC = "" & Table222.データC); 別名を使ったほうが短く記述できます。 別名を使うメリットは記述するのが少し楽になる程度ですので、使わなくても大丈夫です。
その他の回答 (3)
- nicotinism
- ベストアンサー率70% (1019/1452)
サンプルでは データA,データB,データCの複数フィールドで主キー(一意な値を持つ)事が 可能のようですが、この後もレコードを追加してゆくと いつかは地雷を踏みそうです (連結3フィールドで重複するレコードが出来てしまう) なので、テーブル設計に立ち返った方が良いように思えます。 「急がば回れ」です。
補足
ご回答ありがとうございます。 ACCESSを使用してますが、別のアプリケーション(テーブル構造自体違うもの)からインポートしているため、テーブルの構造を変更ですることができないんです・・・。 また、お力を貸していただければ・・・と思います。
- ppg-2
- ベストアンサー率39% (77/193)
原則、どのRDBでもNULLは結合キーにはならないはずです。 よって単純には無理なので何らかの前処理をしないとだめです。 今考え付くのは、 1)仮想表(oracleでいえばview)を作成する(nullの場合にダミー値をセットするもの)。そしてその仮想表同士で結合する 2)結合するキーとなる項目にnullではなく0或いはダミー値に更新する。 でしょうか。 普通に考えれば結合するキーである以上nullがセットされる自体を避けるべきですし、パフォーマンス上も問題あります。 よって上策は2)、下策は1)となります。 ただどうしてもできないのであれば1)の方法をとるしかないでしょう。
補足
ご回答ありがとうございます。 Accessを仕様しているのですが、Replace関数等を使って、Nullを、0か1に変換させようと思ったのですが、(SQL文で一発で実行させたい)うまくいかきません。 まだまだ、初心者で勉強中なのですが・・・。 『結合するキーである以上nullがセットされる自体を避けるべき』 その通りなのですが、データーの構造上、どうしても避けられないんです。 また、お力を貸していただければ・・・と思います。
Access2000で確認しました。 SELECT X.データA, X.データB, X.データC, X.Name111, Y.Name222 INTO TableC FROM Table111 AS X INNER JOIN Table222 AS Y ON ("" & X.データA = "" & Y.データA) AND ("" & X.データB = "" & Y.データB) AND ("" & X.データC = "" & Y.データC); このクエリでTableCに3レコード追加できます。 ポイントは "" & X.データA とすることで強制的に文字列として比較しています。 データがNullの場合 "" & X.データA は ""(ヌル文字)となります。 "" & X.データA の代わりに Nz(X.データA,"") でも同様の結果になります。 Access以外のデータベースで使えるかどうかは分りませんが、同様の手段で出来るかも。
お礼
ご回答ありがとうございます。 SELECT X.データA, X.データB, X.データC・・・・の X・Yというのは? すみません・・・ まだまだ、初心者で勉強中なんです・・・
お礼
venzoさん、ご回答ありがとうございます。 先ほど、実データで#1の方法を実行してみました。 X・Yの意味を理解していなかったので、テーブルの別名はつけずに記述したのですが、希望通りできました!!! 『""』 をつけるのは目からウロコでした! (もともと、実データーもテキスト型だったので・・・) 本当にありがとうございます。!