- - PR -
片方のテーブルに無い行を追加
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-10-10 17:55
下記のようなテーブル(TABLE1,TABLE2)が2つあります。
TABLE1 A(KEY) B C -------------------------- ORANGE ORANGE 1 APPLE RED 1 BANANA YELLOW 1 TABLE2 A(KEY) B C -------------------------- ORANGE ORANGE 2 PEACH PINK 2 PINE YELLOW 2 TABLE1の結果は全て出し、TABLE1になく、TABLE2にある行を追加する。 下記のsqlの結果 SELECT A,B,C FROM (SELECT * FROM TABLE1 UNION SELECT * FROM TABLE2) A(KEY) B C -------------------------- ORANGE ORANGE 1 APPLL RED 1 BANANA YELLOW 1 ORANGE ORANGE 2 ←この行がいらない PEACH PINK 2 PINE YELLOW 2 ここで、ORANGE が2行表示されてしまいます。ここでは、TABLE1の行を表示させたい。 狙いとしては、カラムAでGROUP BY をかけたいとこなんですが、どうもうまくいきません。 DB:ORACLE 9i よろしくお願いします。 テーブルがすごく見にくくて申し訳ないです。編集を何度かしてみたのですが、うまくそろえられなくて… [ メッセージ編集済み 編集者: marlboro 編集日時 2006-10-10 18:11 ] [ メッセージ編集済み 編集者: marlboro 編集日時 2006-10-11 09:57 ] | ||||
|
投稿日時: 2006-10-10 18:32
普通に外部結合すればよろし。
「outer join」でググって見てください。 | ||||
|
投稿日時: 2006-10-10 18:42
TABLE2のORANGE行の列Cの値は、2の間違いじゃないの?
UNIONは重複する行を除くけど、どうもすべての列の値が一致しないと、重複の対象とはみなさないらしい。 ちょっと野暮ったいけど、以下のコードはどう?
未確認なので、ちゃんと動くかどうかはわかりません。 | ||||
|
投稿日時: 2006-10-10 18:50
完全外部結合
| ||||
|
投稿日時: 2006-10-10 19:12
minusとunionを組みわせてできませんか?
ちなみに minusは select * from table2 minus select * from table1 とすれば table2にあるものだけ取り出せます | ||||
|
投稿日時: 2006-10-11 10:24
皆様返答ありがとうございます。本当に助かりました。
>KOXさん >ぷさいくろうさん 完全外部結合というのを知りませんでした。 これでいけると思い試したのですが、お互い外部から結合されたカラムがNULLになってしまい、当方が思っていた意図とは少し違っていました。 勉強になりました。 >七味唐辛子さん UNION と MINUS の組み合わせもうまくいきそうな感じですけど、 やはりUNIONを使うと全ての列名と一致しないと表示されてしまい、 当方の結果と同じになりました。 アイデアありがとうございました。 >かずくんさん >TABLE2のORANGE行の列Cの値は、2の間違いじゃないの? はい。ご指摘どうりタイプミスでした。編集しておきました。 > select A, B, C from TABLE1 > union all > select A, B, C from TABLE2 > where TABLE2.A not in (select A from TABLE 1) 動作確認できました。そして、問題解決しました。 どうもありがとうございます。 [ メッセージ編集済み 編集者: marlboro 編集日時 2006-10-11 13:06 ] | ||||
|
投稿日時: 2006-10-11 10:51
>select A, B, C from TABLE1
>union all >select A, B, C from TABLE2 >where TABLE2.A not in (select A from TABLE 1) union allが集合同士の和集合なら full joinも集合同士の和集合だ よってこうだ select coalesce(aaa.A,bbb.A) coalesce(aaa.B,bbb.B) coalesce(aaa.C,bbb.C) from TABLE1 aaa full join TABLE2 bbb on aaa.a=bbb.a nullありなら select coalesce(aaa.A,bbb.A) nvl2(aaa.A,aaa.B,bbb.B) nvl2(aaa.A,aaa.C,bbb.C) from TABLE1 aaa full join TABLE2 bbb on aaa.a=bbb.a [ メッセージ編集済み 編集者: ぷさいくろう 編集日時 2006-10-11 11:09 ] | ||||
|
投稿日時: 2006-10-11 13:09
ぷさいくろうさんありがとうございます。
>select coalesce(aaa.A,bbb.A) >coalesce(aaa.B,bbb.B) >coalesce(aaa.C,bbb.C) >from TABLE1 aaa full join TABLE2 bbb >on aaa.a=bbb.a のSQLで問題解決しました。 ありがとうございます。 |