- 締切済み
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 (+)
- gogoogoo11
- お礼率60% (56/93)
- Oracle
- 回答数2
- ありがとう数2
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- 3rd_001
- ベストアンサー率66% (115/174)
以下のような結合ならエラーになります。 AとBを外部結合(Aが主) BとCを外部結合(Cが主) SQL> l select a.ename from emp a, emp b, dept c where a.empno = b.empno(+) and c.deptno = b.deptno(+) ; SQL> / where a.empno = b.empno(+) * 行5でエラーが発生しました。: ORA-01417: 表が少なくとも1つの他の表に外部結合されている可能性があります。 どうしてもやりたい場合はサブクエリにするとか、Viewにするとか すればよいです。 SQL> l select a.ename from emp a, (select b.empno,c.deptno from emp b, dept c where c.deptno = b.deptno(+) ) x where a.empno = x.empno(+) ; SQL> / ENAME -------------------- ALLEN WARD JONES MARTIN BLAKE CLARK KING TURNER JAMES FORD MILLER ちなみに、例で出された以下の結合ならエラーになりません。 AとBを外部結合(Aが主) BとCを外部結合(Bが主)
- nora1962
- ベストアンサー率60% (431/717)
お使いのオラクルのバージョンは?また、エラーメッセージは? ORACLE9iR2ではエラーにはなりませんが。
関連するQ&A
- オラクルで外部結合
オラクル8iを使用しています。 テーブルを外部結合する場合のパフォーマンスについてお聞きしたいのですが、 下の二つのSQL文でパフォーマンスは変わってくるのでしょうか? (外部結合記号(+)を=の前後につけた場合) SELECT 項目 FROM テーブル1 A, テーブル2 B WHERE A.項目1 = B.項目1(+); SELECT 項目 FROM テーブル1 A, テーブル2 B WHERE B.項目1(+) = A.項目1;
- ベストアンサー
- その他(データベース)
- 【至急】SQLの結合について教えてください。
select * from A where ab = '1' and cd = '2' select ef from B where ab = '1' and cd = '2' and ef = '3' 至急質問させてください。 上記SQLを結合したいです。(Oracleです) 取得したいデータはAのテーブルの全項目で、 取得条件として、Bのテーブルの項目ef = '3' だったらという条件を加えたいです。 キー項目は両テーブルとも同じ(ab, cd)です。 どのようなSQLがスマートでしょうか。。 無知で申し訳ございませんが、ご教授いただけますと幸いです。 よろしくお願いいたします。
- 締切済み
- SQL Server
- 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 ???? こんな感じでつまづいてしまいました・・・
- 締切済み
- その他(データベース)
- 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は使い方がよくわからないためシンタックスエラーにしかならず...。 そもそも、縦に結合?はできるのでしょうか??? あれこれ試してみたのですが、詰まってしまったので、 どなたか知恵をお貸しください。
- ベストアンサー
- PostgreSQL
- SQL文で質問です
SQL文で質問です。 テーブルA X NUMBER型 Y DATE型(年月日と時間) テーブルB Z NUMBER型 W DATE型(年月日) A,BをAを主テーブルとして外部結合し、同じ年月日でBには無いデータ を取得したいのですが、 SELECT A.X FROM A,B WHERE A.X = B.Z(+) AND A.Y = B.W(+) AND B.Z IS NULL; というSQL文を実行すると、テーブルAには時間まで登録されているので 実際には取得したいデータが存在しても 「レコードが選択されませんでした」 になってしまいます。このため、 SELECT A.X FROM A,B WHERE A.X = B.Z(+) AND TO_DATE(A.Y,'YYYY/MM/DD') = TO_DATE(B.W,'YYYY/MM/DD')(+) AND B.Z IS NULL; としてみたところ、今度は3行目で 「ORA-00936: 式がありません」 というエラーになってしまいます。 外部結合にしたことがエラーの原因のようなのですが、DATE型の項目を キーにして外部結合にするにはどうすれば良いのでしょうか?
- ベストアンサー
- Oracle
- 【至急】SQLの結合について教えてください(2)
select * from A select ef from B where ef = '3' かつ、A.ab = B.ab and A.cd = B.cd 至急質問させてください。 上記SQLを結合したいです。 取得したいデータはAのテーブルの全項目で、 取得条件として、Aのテーブルのキー項目 = Bのテーブルのキー項目に、Bのテーブルの項目ef = '3' だったらという条件を加えたいです。 どのようなSQLがスマートでしょうか。。 無知で申し訳ございませんが、ご教授いただけますと幸いです。 よろしくお願いいたします。 ※キー項目の値は条件に指定できない(持っていない)ことがわかりました。 先ほどの質問にご回答下さった皆様、申し訳ございません。
- ベストアンサー
- SQL Server
- テーブル結合について、下記SQLをANSI結合の書き方で表したい。
テーブル結合について、下記SQLをANSI結合の書き方で表したい。 select * from (select key from A union select key from B union select key from C) X, A,B,C where X.key=A.key(+) and X.key=B.key(+) and X.key=C.key(+) このSQLをANSI結合の記述で書きたいのですが、 (+)での結合文になれておらず試行錯誤しております。 下記のようなのかなとは模索しておりますが、 手元に実行環境がなくわかりません。 また、要所気付く点などありましたら、ご指摘願います。 select A.*, B.*, C.* from (select key from A union select key from B union select key from C) X, LEFT JOIN A ON X.key=A.key LEFT JOIN B ON X.key=B.key LEFT JOIN C ON X.key=C.key
- ベストアンサー
- Oracle
- 外部結合について
外部結合というのは、表と表を結合するという事で 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句で指定する選択の条件全てに(+)を付けない」 であれば、カラム毎に外部結合演算子を指定する意味が無いと思うのですが。 どなたか、カラム毎に外部結合演算子を指定する意味をご教授下さい。 宜しくお願いします。
- ベストアンサー
- Oracle
- 外部結合と等価結合のパフォーマンスの違いについて(ビューの場合)
Oracle10gでのSQL文の違いについて教えて下さい。 前回の質問は、ストアドプロシージャに記述 されていて、バッチとして動かしています。 と書きましたが、ビューの場合のパフォーマンスの違いは どうなるのでしょうか?ビューの場合も同じような現象です。 下記の2つのSQL文は外部結合ありと外部結合なしの違いだけで、 他は変わりありません。 外部結合ありのほうは 結果がすぐに返されるのですが、外部結合なしのほうは 結果が返ってこない、あるいはかなり時間がかかるという 現象が起きています。 SQL文は簡略して記述していますが、SELECT句には、 TO_CHAR()やSUM(CASE WHEN ...THEN ...ELSE...)が使用してあり 少し重くなる処理も含まれています。 この2つのSQL文でパフォーマンスに影響している原因は 何なんでしょうか?オプティマイザとか実行計画とかの 説明を読んだのですが、いまいちよく解りません。。 自分では中級者以下だと思っていますので、わかりやすく 説明して頂けたら助かります。宜しくお願い致します。 (外部結合ありのSQL) SELECT a.項目1, a.項目2, a.項目3, a.項目4, a.項目5 FROM TBL_A a, TBL_B b WHERE a.項目1 = b.項目1(+) AND a.項目2 = b.項目2(+) AND a.項目3 = b.項目3(+) AND a.項目4 = b.項目4(+) AND GROUP BY a.項目1, a.項目2, a.項目3, a.項目4, a.項目5 (外部結合なしのSQL) SELECT a.項目1, a.項目2, a.項目3, a.項目4, a.項目5 FROM TBL_A a, TBL_B b WHERE a.項目1 = b.項目1 AND a.項目2 = b.項目2 AND a.項目3 = b.項目3 AND a.項目4 = b.項目4 AND GROUP BY a.項目1, a.項目2, a.項目3, a.項目4, a.項目5
- ベストアンサー
- Oracle
- 複数の表の外部結合について
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』を取得できるのでしょうか? 御存知の方、教えてください!
- ベストアンサー
- その他(データベース)