- PR -

Oracle での外部結合

投稿者投稿内容
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-10-27 10:26
■Oracle10g

Oracle の以下のようなテーブルがあります。
コード:
会員テーブル
  会員番号  VARCHAR2(10)
  カード番号 NUMBER

顧客テーブル
  会員番号  VARCHAR2(10)
  カード番号 NUMBER
  利用者名  VARCHAR2(50)



データとして、以下のようなデータが入っているとします。
コード:
会員テーブル
  11111,1
  11111,2
  11111,3
  11111,4
  11111,5

顧客テーブル
  11111,1,太郎
  11111,3,次郎
  11111,5,三郎



で、以下のような結果を取得したいと思っています。
コード:
  11111,1,太郎
  11111,2,NULL
  11111,3,次郎
  11111,4,NULL
  11111,5,三郎



そこで、
コード:
select A.会員番号,A.カード番号,B.利用者名 from 会員テーブル A,顧客テーブル B
where A.会員番号 = '11111' and A.会員番号 = B.会員番号
and A.カード番号 (+)= B.カード番号;


という外部結合でいけると思っていましたが、実行すると顧客テーブルに存在するデータしか取得できない感じです。

何か単純な間違いをしているのでしょうか?
ご教示の程、よろしくお願い致します。
想馬
大ベテラン
会議室デビュー日: 2003/05/29
投稿数: 245
お住まい・勤務地: 神奈川・東京
投稿日時: 2006-10-27 10:31
外部結合なのでouter joinを使うと思います。

http://www.seshop.com/se/edu/shikaku/omo/miti/silver_miti26.asp?educat=silver2
_________________
己への戒め

「活動的な馬鹿より恐ろしいものはない」 by ゲーテ
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2006-10-27 10:36
引用:

ひろれいさんの書き込み (2006-10-27 10:26) より:
コード:
select A.会員番号,A.カード番号,B.利用者名 from 会員テーブル A,顧客テーブル B
where A.会員番号 = '11111' and A.会員番号 = B.会員番号
and A.カード番号 (+)= B.カード番号;





これを、
コード:
select A.会員番号,A.カード番号,B.利用者名 from 会員テーブル A,顧客テーブル B
where A.会員番号 = '11111' and A.会員番号 (+)= B.会員番号
and A.カード番号 (+)= B.カード番号;


としたら、どうだろう。

ちなみに、標準SQLだと
コード:
select 
  A.会員番号,A.カード番号,B.利用者名 
from 
  会員テーブル A
left outer join 顧客テーブル B
  on A.会員番号 = B.会員番号 and A.カード番号 = B.カード番号
where 
  A.会員番号 = '11111' 


かな?
99ri
大ベテラン
会議室デビュー日: 2006/09/09
投稿数: 129
投稿日時: 2006-10-27 10:48
DBMS固有の記述では外部結合の指定がOracleとSQLServerでは逆になります

From テーブルA
outer join テーブルB

Oracle テーブルB.カラム(+)
SQLServer テーブルA.カラム*  <===たぶんこういう指定のはず
ぷさいくろう
ぬし
会議室デビュー日: 2006/08/30
投稿数: 1034
投稿日時: 2006-10-27 10:50
(+)をつける場所がちがうから

慣れないうちは
スカラー問い合わせでやってもよし
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-10-27 10:51
想馬さん、かずくんさん、こんにちは。

引用:

かずくんさんの書き込み (2006-10-27 10:36) より:

引用:

ひろれいさんの書き込み (2006-10-27 10:26) より:
コード:
select A.会員番号,A.カード番号,B.利用者名 from 会員テーブル A,顧客テーブル B
where A.会員番号 = '11111' and A.会員番号 = B.会員番号
and A.カード番号 (+)= B.カード番号;





これを、
コード:
select A.会員番号,A.カード番号,B.利用者名 from 会員テーブル A,顧客テーブル B
where A.会員番号 = '11111' and A.会員番号 (+)= B.会員番号
and A.カード番号 (+)= B.カード番号;


としたら、どうだろう。

ちなみに、標準SQLだと
コード:
select 
  A.会員番号,A.カード番号,B.利用者名 
from 
  会員テーブル A
left outer join 顧客テーブル B
  on A.会員番号 = B.会員番号 and A.カード番号 = B.カード番号
where 
  A.会員番号 = '11111' 


かな?



Oracle マスター持ちなのに、お恥ずかしい・・・

結果として、想馬さんご指摘の「OUTER JOIN」を使って出来ました。
SQL だと、かずくんさん提示の標準SQL になりますね。
お二人ともありがとうございました。

でも、「(+)=」を使うと結果が異なるんですよね。どうしてだろ・・・
何か単純な間違いをしているのかな。今日、頭おかしいし(^_^;)

ちなみに、SQL*Plus で確認しました。
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-10-27 10:57
99riさん、ぷさいくろうさん、こんにちは。

引用:

ぷさいくろうさんの書き込み (2006-10-27 10:50) より:

(+)をつける場所がちがうから

慣れないうちは
スカラー問い合わせでやってもよし



\(◎o◎)/(衝撃!

ホントだ。出来ました。
うろ覚えのまま疑わずにいました。大変申し訳ありません。
調べれば良かった・・・

この恥ずかしいスレ、消したい(^_^;)
ぷさいくろう
ぬし
会議室デビュー日: 2006/08/30
投稿数: 1034
投稿日時: 2006-10-27 10:59
コード:
select A.会員番号,A.カード番号,B.利用者名 from 会員テーブル A,顧客テーブル B
where A.会員番号 = '11111' and A.会員番号 (+)= B.会員番号
and A.カード番号 (+)= B.カード番号;


としたら、どうだろう。

ちなみに、標準SQLだと
コード:
select 
  A.会員番号,A.カード番号,B.利用者名 
from 
  会員テーブル A
left outer join 顧客テーブル B
  on A.会員番号 = B.会員番号 and A.カード番号 = B.カード番号
where 
  A.会員番号 = '11111' 


かな?
[/quote]

違う違う
(+)をつけるとなくても残すという意味

この場合は
left joinをright joinにすると同じ意味

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