- ベストアンサー
OracleのSQLについての質問
- OracleのSQLについて質問があります。下記の3つのプログラムを作成する方法が分かりません。
- A表に存在して、B表に存在しないデータを表示するプログラムを作成したいです。
- B表に存在して、A表に存在しないデータを表示するプログラムを作成したいです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
「プログラム」じゃなくて「クエリ(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
その他の回答 (1)
- reset_cat
- ベストアンサー率68% (94/138)
(1)、(2)はminus句、(3)は等価結合で主キーのみのデータを作成し、その後それぞれのテーブルと結合すればいいかと・・・ ぱっと思いつきで書いているので違ってたらゴメンナサイ。
補足
MINUS句がございましたか! しかし、申し訳ございません。。 上記、表の列数は同じではありません。。。。 -------------------------------------------------- MINUS句 表「a」と表「b」のSELECTした列数が同じでないとMINUSはできない。
お礼
とても勉強になりました! 回答者様の文章は答えとして、 INNER JOIN とOUTER JOIN をググって、がんばってみます!