こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

OracleのSQLについて質問があります。

OracleのSQLについて質問があります。
下記、3つのプログラムを作成する方法が分かりません。
プログラムファイルは、1ファイル、でも、3ファイルでも良い。

(1)A表に存在して、B表に存在しないデータを表示
(2)B表に存在して、A表に存在しないデータを表示
(3)A表とB表どちらにも存在するが、値が違うデータを表示

※主キーは、A,B
A表
| a | b | c |
-------------
| 1 | 1 | 1 |→(3)なので表示
| 1 | 2 | 2 |→(1)なので表示
| 1 | 3 | 3 |
| 1 | 5 | 5 |

B表
| a | b | c |
-------------
| 1 | 1 | 0 |→(3)なので表示
| 1 | 3 | 3 |
| 1 | 4 | 4 |→(2)なので表示
| 1 | 5 | 5 |

学校の問題なので、自己解決が良いのでしょうが、検討もつきません。
答え、もしくは、ヒントをご教授お願いします。

投稿日時 - 2010-05-18 10:14:02

QNo.5903238

すぐに回答ほしいです

質問者が選んだベストアンサー

「プログラム」じゃなくて「クエリ(SQL)」ですね。
先ず、(1)と(2)は主従関係のある結合になります。
これは「OUTER JOIN」と言います。これには
どちら(先に書くか後から書くか)のテーブルが主に
なるかで、LEFT(先の方)とRIGHT(後の方)の
2種類があります。
(1)の考え方
SELECT A表.* FROM A表 LEFT OUTER JOIN B表
ON A表.a=B表.b AND A表.b=B表.b
WHERE B表.a IS NULL AND B表.b IS NULL

A表とB表を結合しますが、A表が主で、左(先)に記述
してあるので、LEFT OUTER JOIN になります。次に、
結合条件を示すON句で、それぞれのaとbの関係を記述
します。この結合ではA表は全て取得され、B表に無い
項目はNULLになりますので、WHERE句でB表側の項目が
NULLという指定をすれば「A表にあってB表にない」を
抽出できます。主キー項目はNULLにできないので、
WHERE句に記述する条件はaかbの一方だけでもよい
はずです。

(2)の考え方
もう分かると思うので省略します。

(3)の考え方は両方にあるものが前提なので、主従の
関係はありません。この場合は INNER JOIN になり
ます。また、条件はA表.c<>B表.cとなります。

SELECT A表.* FROM A表 INNER JOIN B表
ON A表.a=B表.b AND A表.b=B表.b
WHERE A表.c<>B表.c

投稿日時 - 2010-05-18 13:15:41

お礼

とても勉強になりました!
回答者様の文章は答えとして、
INNER JOIN とOUTER JOIN をググって、がんばってみます!

投稿日時 - 2010-05-18 13:30:01

ANo.2

このQ&Aは役に立ちましたか?

16人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

(1)、(2)はminus句、(3)は等価結合で主キーのみのデータを作成し、その後それぞれのテーブルと結合すればいいかと・・・

ぱっと思いつきで書いているので違ってたらゴメンナサイ。

投稿日時 - 2010-05-18 12:02:46

補足

MINUS句がございましたか!

しかし、申し訳ございません。。
上記、表の列数は同じではありません。。。。
--------------------------------------------------
MINUS句
表「a」と表「b」のSELECTした列数が同じでないとMINUSはできない。

投稿日時 - 2010-05-18 13:00:39

あなたにオススメの質問