- PR -

片方のテーブルに無い行を追加

投稿者投稿内容
marlboro
会議室デビュー日: 2006/05/12
投稿数: 16
投稿日時: 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 ]
KOX
大ベテラン
会議室デビュー日: 2004/08/23
投稿数: 142
投稿日時: 2006-10-10 18:32
普通に外部結合すればよろし。
「outer join」でググって見てください。
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2006-10-10 18:42
TABLE2のORANGE行の列Cの値は、2の間違いじゃないの?

UNIONは重複する行を除くけど、どうもすべての列の値が一致しないと、重複の対象とはみなさないらしい。

ちょっと野暮ったいけど、以下のコードはどう?
コード:
select A, B, C from TABLE1 
union all
select A, B, C from TABLE2
where TABLE2.A not in (select A from TABLE 1)



未確認なので、ちゃんと動くかどうかはわかりません。
ぷさいくろう
ぬし
会議室デビュー日: 2006/08/30
投稿数: 1034
投稿日時: 2006-10-10 18:50
完全外部結合
七味唐辛子
ぬし
会議室デビュー日: 2001/12/25
投稿数: 660
投稿日時: 2006-10-10 19:12
minusとunionを組みわせてできませんか?
ちなみに minusは 

select * from table2
minus
select * from table1
とすれば table2にあるものだけ取り出せます


marlboro
会議室デビュー日: 2006/05/12
投稿数: 16
投稿日時: 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/08/30
投稿数: 1034
投稿日時: 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 ]
marlboro
会議室デビュー日: 2006/05/12
投稿数: 16
投稿日時: 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で問題解決しました。
ありがとうございます。

スキルアップ/キャリアアップ(JOB@IT)