Oracle8iを使用して複数の表から特定のデータを抽出する方法

このQ&Aのポイント
  • Oracle8iを使用して複数の表から特定のデータを抽出するSQL文を作成する方法について説明します。
  • 「A,B,Cの表のうちCのみに存在しないKaiinID」を検索するSQL文を実行した際に発生するエラーについて説明します。
  • 「3つの表のうち1つの表のみに存在しないKaiinID」を取得するための方法についてアドバイスを求めています。
回答を見る
  • ベストアンサー

複数の表の外部結合について

Oracle8iを使用して複数の表から特定のデータを抽出するSQL文を作っています。 【表A】 KaiinID | Name ----------------- 11111 | aaaaa ----------------- 22222 | bbbbb ----------------- 44444 | ddddd ----------------- 55555 | eeeee ----------------- 【表B】 KaiinID | Address ------------------- 11111 | address1 ------------------- 44444 | address4 ------------------- 66666 | address6 ------------------- 77777 | address7 ------------------- 【表C】 KaiinID | Memo ----------------- 11111 | Memo1 ----------------- 22222 | Memo2 ----------------- 33333 | Memo3 ----------------- 66666 | Memo6 ----------------- 【欲しい結果】 KaiinID -------- 44444 『A,B,Cの表のうちCのみに存在しないKaiinID』を検索するSQL文を実行したところ、以下のエラーが表示されてしまいました。 Select A.KaiinID From A,B,C Where A.KaiinID=B.KaiinID and A.KaiinID=C.KaiinID(+) and B.KaiinID=C.KaiinID(+); 「3行でエラーが発生しました。  ORA-01417:表が少なくとも1つの他の表に外部結合されている可能性があります。」 このエラーを見ても「外部結合されている可能性?確かにしてるけど・・・」 としかわかりません。 Select A.KaiinID From A,B Where A.KaiinID=B.KaiinID and A.KaiinID not in (Select KaiinID From C); ともしてみたのですが、こちらは実行した途端SQL*Plusが応答なしになってしまいました。 (実際の表にはA,B,Cそれぞれ300万件近いデータがあります) どのようにすれば、『3つの表のうち1つの表のみに存在しないKaiinID』を取得できるのでしょうか? 御存知の方、教えてください!

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

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

1.not inではなく、not existsを使う Select A.KaiinID From A,B Where A.KaiinID=B.KaiinID and not exists (Select KaiinID From C where A.KaiinID = C.KaiinID ); 2.A,Bを結合させた結果にminusを使う Select A.KaiinID From A,B Where A.KaiinID=B.KaiinID minus Select KaiinID From C どちらが速いかはわかりませんが。

lovelypooh
質問者

お礼

回答ありがとうございます。 1.のnot existsを実行すると応答なしになってしまったので 2.を実行したところ、結果が返ってきました! minusは知らなかったので合わせてありがたい情報でした。 おかげで解決しました。 また機会がありましたら教えてください(ペコリ)。

関連するQ&A

  • SQL 外部結合についての質問

    SQLの外部結合についての質問です。 今テーブルA,B,Cがあるとします。 AはBに対して外部結合。BはCに対して外部結合 というようにする事は出来ますでしょうか。 SQLを実行してもエラーになります (例) select A.* from A,B,c where A.項目1 = B.項目1 (+) and B.項目2 = C.項目2 (+)

  • 3つの表の外部結合

    表A、B、Cの3つがあり、Aのすべての行を出力したいと考えています。 外部結合を用いるのだとは思うのですが、3つの表に対して行う場合の 書き方がわからず困っています。 ご教授いただけないでしょうか? select * from a,b,c where a.商品ID =b.商品ID (+) and b.商品ID (+) =c.商品ID (+) としてみましたが、うまくいきませんでした。

  • 外部結合に条件をつけたい

    oracle初心者です。 表A:ID、氏名 表B:ID、入社年、給与 上の表A,Bを、表Aを左辺にしてLEFT JOINする場合に、単純な外部結合では無く、 入社年が2000年以降の表Bのみ結合したい時のSQL文ですが、 select * from 表A LEFT JOIN 表B ON 表A.ID=表B.ID where 表B.入社年 > 2000 または、 select * from 表A,表B where 表A.ID=表B.ID(+) and 表B.入社年 > 2000 のように記述して実行すると、内部結合になってしまいます。 これを(外部結合として)実現するには、どのように記述すればよいでしょうか? 宜しくお願いいたします。

  • 外部結合について

    外部結合というのは、表と表を結合するという事で FROM句に書くべきことと思うのですが、 なぜWHERE句(カラム毎に指定)で指定するのでしょうか? 例えば、 テーブルA No|Kind|Name| ------------- 1|1 |A | 1|2 |B | 2|1 |C | 2|2 |D | テーブルB No|Kind|Data| ------------- 1|1 |10| 外部結合で SELECT A.No, A.Kind, A.Name, B.Data FROM A,B WHERE A.No = B.No(+) AND A.Kind = B.Kind(+) とすると No|Kind|Name|Data| ------------------ 1|1 |A |10| 1|2 |B |NULL| 2|1 |C |NULL| 2|2 |D |NULL| となります。 A.NoがB.NoになくてもOKで、Kindは 完全に一致しないとだめという意味で SELECT A.No, A.Kind, A.Name, B.Data FROM A,B WHERE A.No = B.No(+) AND A.Kind = B.Kind とした場合、 No|Kind|Name|Data| ------------------ 1|1 |A |10| 2|1 |C |NULL| となるのであれば納得いくのですが、 結果は↓なるようです。 No|Kind|Name|Data| -------------------------- 1|1 |A |10| (+)を一つも付けてない場合と 同じ動作になるようです。 テーブルAとテーブルBを結合するとき、 「外部結合する場合はWHERE句で指定する選択の条件全てに(+)を付ける」 「外部結合をしない場合はWHERE句で指定する選択の条件全てに(+)を付けない」 であれば、カラム毎に外部結合演算子を指定する意味が無いと思うのですが。 どなたか、カラム毎に外部結合演算子を指定する意味をご教授下さい。 宜しくお願いします。

  • SQL 表の結合

    SQLで2つの表から条件に合ったデータを取り出し、同じ列に表示させたいのですが、 どうやっても外部結合のようにすることしかできませんでした。 取り出したデータを縦に結合?させることはできるのでしょうか? 例) dataは月の上旬中旬下旬でそれぞれabcとします。 入力値はmonthとdayで、これらからuriageを選択します。 dataの取りうる値はa,b,c,ab,bc,abcとします。    table:A 売上表            table:B 上旬中旬下旬判断 ---------------------------   -----------  key | data | month | uriage   day | data ---------------------------    -----------   1 |  a  |  1  |  500      1 |  a   2 |  ab  |  1  |  800     … |  …   3 |  bc  |  1  |  400     10 |  a   4 |  c  |  1  |  100     11 |  b   5 |  abc |  1  |  900     … |  …   … |  …  |  …  | …     31 |  c ---------------------------    ----------- month = 1 , day =5のとき  table:Bより   SELECT data FROM table:B WHERE day = 5 としてdata "a" を得ます。 この"a"と同じdataを持つuriageを表示させたいので   SELECT uriage FROM table:A   WHERE month = 1 AND data = (SELECT data FROM table:B WHERE day = 5) として  table:query1  --------    uriage  --------    500  -------- を得ました。 ここまでは良いのですが、これに付け加えて、 table:Bから取り出したdata "a"をtable:Aのdataが含むとき(data = a,ab,abcのとき) その全てのuriageを表示させたく、 ワイルドカードを使おうと   SELECT uriage FROM table:A   WHERE month = 1 AND data = %(SELECT data FROM table:B WHERE day = 5)% 等としてみたのですが、上手くいきませんでした。 そこで、別のクエリーを作って   SELECT uriage FROM table:A   WHERE month = 1 AND data = 'ab' AND data = 'abc' として  table:query2  ---------   uriage  ---------    800  ---------    900  ---------- を得ました。 そして、最後に、 得られた2つの表をまとめて  ---------   uriage  ---------    500  ---------    800  ---------    900  --------- としたいのですが、   SELECT uriage, uriage FROM query1, query2 とすると  ------------------   uriage | uriage  ------------------    500  |  800    500  |  900  ------------------ となりますし、UNIONは使い方がよくわからないためシンタックスエラーにしかならず...。 そもそも、縦に結合?はできるのでしょうか??? あれこれ試してみたのですが、詰まってしまったので、 どなたか知恵をお貸しください。

  • 3テーブル外部結合方法について

    3つのテーブルを外部結合したいのですが・・・、 こんがらがってしまいました。 A,B,Cの3テーブルがあり、A,B,Cの順に外部結合 (LEFT OUTER JOIN)したいのですが、 A,BのテーブルについてはWhere句の条件指定が 必要です。 Select From (Select AA.a From A AA Where b = xxxx) BB Left Outer Join (Select CC.b From B CC Where c = eeee and BB.a = CC.b) On ???? こんな感じでつまづいてしまいました・・・

  • 3つ以上の表の外部結合について

    以下のSQLにおいて、表Cに存在するすべてのレコードを表示したいのですが、 表Aと表Cに存在するものしか表示されません。 表Cをメインとし、表示させる方法はありますでしょうか? select A.FITEMNO from A , B , B B2 , C where C.FCHILDITEMNO = A.FITEMNO(+) and C.FPARENTITEMNO = B2.FITEMNO and A.FITEMNO = B.FITEMNO and B.FITEMTYP = 'P' and (B2.FITEMNO = '123456789')

  • オラクルで外部結合

    オラクル8iを使用しています。 テーブルを外部結合する場合のパフォーマンスについてお聞きしたいのですが、 下の二つのSQL文でパフォーマンスは変わってくるのでしょうか? (外部結合記号(+)を=の前後につけた場合) SELECT 項目 FROM テーブル1 A, テーブル2 B WHERE A.項目1 = B.項目1(+); SELECT 項目 FROM テーブル1 A, テーブル2 B WHERE B.項目1(+) = A.項目1;

  • 複数の外部結合のやり方

    店舗表(SHOP)、ビル表(BIL)、都道府県表(AREA)、関連表(LINK)を取り出すSQLを 作成しています。 以下の状態だと店舗表(SHOP)とビル表(BIL)が紐づいていないデータにも都道府県 が出てしまいデータとしておかしなことになっています。 (BIL(B)とBIL(C)の紐付きがないから?) Oracleのように外部結合(+)が使えず・・・どのように修正すればいいか教えてください。 SELECT S.SHOP_ID,S.SHOP_NAME,A.TIIKI_NAME,A.TODOUFUKEN_NAME,B.BIL_NAME,B.ADDRESS,B.MEMO FROM SHOP AS S LEFT JOIN BIL AS B ON S.BIL_ID=B.BIL_ID, BIL AS C RIGHT JOIN AREA AS A ON .TODOUFUKEN_ID=A.TODOUFUKEN_ID, LINK AS L WHERE S.TIIKI_ID=A.TIIKI_ID AND S.DELETE=0 GROUP BY SHOP_ID ORDER BY A.TIIKI_ID,S.SHOP_ID よろしくお願いします。

  • Accessの表結合SQL

    AccessのSQLで外部結合を複数使うと SQLがエラーになります。 クエリで確認してエラーにならない様につくってみましたが、意図する事をやろうとするとエラーになります。 どこが悪いか教えていただけませんか?おそらくSQLサーバーでは余裕で通るSQLだと思うのですが。。。 SQL = SELECT * FROM T1 LEFT JOIN T2 ON T1.A = T2.A LEFT JOIN T3 ON T1.B = T3.B LEFT JOIN T4 ON T1.C = T4.C AND T4.D = iNum WHERE T1.E = 'iNum' やりたいのはT1を基準にT2,T3,T4からデータを引っ張ってきたい。その条件としてT4から引っ張ってくるのは T4.DがiNumである事、基準となるT1のT1.EがiNumである事です。 Accessでは"AND T4.D = iNum"がだめで、 WHERE区に書くと外部結合にもかかわらずT4.D = iNumのデータしか抽出されなくなる。(T1.C = T4.CのデータがT4.D = iNumでなくてもT1のデータが抽出されなくてはならない。) さらに SQL = SELECT * FROM ((T1 LEFT JOIN T2 ON T1.A = T2.A) LEFT JOIN T3 ON T1.B = T3.B) LEFT JOIN T4 ON T1.C = T4.C AND T4.D = iNum WHERE T1.E = 'iNum' こんな括弧が必要になってくる。 これだとT1とT2を外部結合した結果をT3と外部結合して さらにその結果をT4と外部結合しているという意味あいになってしまって、意図が違うのですが。。 結果は同じなのでAccessに譲ってやってもいいのですが 前者はT1で抽出されなければならないデータが抽出されないので困ります。 よろしくお願いいたします。