インラインビューで他テーブルの別名参照できない?

このQ&Aのポイント
  • Oracle9iで開発をしています。インラインビューでのSQLについて困っています。会社テーブルの設立日が12ヶ月前から現在までの社員テーブルIDと商品テーブル種類を取得したいのですが、外部の別名を参照することができずエラーが発生します。インラインビューで他テーブルの別名参照ができない場合の対策方法を教えてください。
  • Oracle9iでの開発において、インラインビューを使ったSQLで問題が発生しています。会社テーブルの設立日が12ヶ月前から現在までの社員テーブルIDと商品テーブル種類を取得したいのですが、外部の別名をインラインビュー内で参照することができずエラーが発生します。他テーブルの別名を参照する方法や対策方法を教えてください。
  • Oracle9iでの開発で、インラインビューを使用したSQLについて困っています。会社テーブルの設立日が12ヶ月前から現在までの社員テーブルIDと商品テーブル種類を取得したいのですが、外部の別名をインラインビュー内で参照することができません。他テーブルの別名参照ができない場合の対策方法を教えてください。
回答を見る
  • ベストアンサー

インラインビューにおける他テーブルの別名参照ができない

Oracle9iで開発をしています。 インラインビューを使ったSQLで行き詰ってしまいました。 抽出条件として会社テーブルの設立日が12ヶ月前からシステム日付まで、 その該当テーブルのID = 社員テーブルのIDとなる名称を取り出す。 上記に該当する社員テーブルの種類 = 商品テーブルの種類となる名称を取り出す。 となるようにSQLを考えると、 SELECT T1.NAME, T2.NAME FROM 会社テーブル C, (SELECT * FROM 社員テーブル E WHERE C.ID = E.ID) T1, (SELECT * FROM 商品テーブル A WHERE T1.KIND = A.KIND)T2, WHERE C.DATE BETWEEN add_month(sysdate,-12) AND sysdate のような感じになりまして、実行すると"C"."ID":無効な識別子ですと 表示されました。 インラインビューの中ではC、T1のように外部の別名を参照することは できないのでしょうか? できない場合の対策方法なども教えてください。

  • Oracle
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
回答No.1

>インラインビューの中ではC、T1のように外部の別名を参照することは >できないのでしょうか? 少なくとも、FROMに書くサブクエリでは、同列に並べた他の表を参照することはできません。 従来記法の結合で書くなら.. select t1.name,t2.name from 会社テーブル c,社員テーブル t1,商品テーブル t2 where c.id=t1.id and t1.kind=t2.kind and c.date between add_month(sysdate,-12) and sysdate で良いと思いますし、ansi構文でなくなら、 select t1.name,t2.name from 会社テーブル c inner join 社員テーブル t1 on (c.id=t1.id) inner join 商品テーブル t2 on (t1.kind=t2.kind) where c.date between add_month(sysdate,-12) and sysdate で書けるかと思います。(未検証&思いつき)

yachoi
質問者

お礼

FROMのなかのサブクエリは表の参照ができませんでしたか。 サブクエリばかりに目が行ってしまい、結合できることに気がつきませんでした。 ありがとうございます。

関連するQ&A

  • テーブル参照について

    お世話になります。 AテーブルとBテーブルを比較し、Aテーブルにしかないデータ一覧を表示するSQL文を作成しました。 SELECT * FROM Aテーブル WHERE NOT EXISTS(SELECT * FROM Bテーブル WHERE CODE=Aテーブル.CODE AND NAME=Bテーブル.NAME) 下記の場合はどのように記述すればいいのでしょうか? 検索結果はAテーブルに存在しているが、BテーブルまたはCテーブルには存在していないデータ。 以上よろしくお願いいたします。

  • データの無いテーブルと結合してデータ抽出

    以下のテーブルを使用してデータを抽出したいのですが、データが抽出できません。 名称テーブル -------------------- ID | NAME | -------------------- 0   AA 1   BB 2   EE 3   FF 履歴テーブル -------------------- ID | DAY | OLDNAME -------------------- 2   2004   CC 3   2004   DD 結果取得したいデータ -------------------- ID | NAME | OLDNAME -------------------- 0   AA =現在のSQL= SELECT A.ID, A.NAME, B.OLDNAME FROM 名称 A , 履歴 B WHERE A.ID = B.ID(+) AND A.ID=0 AND B.DAY =  (SELECT MAX(C.DAY)  FROM 履歴 C  WHERE  A.ID = C.ID(+)) 履歴テーブルには名称テーブルの履歴があります。 履歴にデータが無くても名称データを取得したいのですが、こういった場合はどのようなSQLを作ればいいのでしょうか。

  • FROM テーブル 名前 ?

    SQLについての質問です. select a.name, b.id from テーブルA a テーブルB b where... というSQLのfromのあとはどういう意味なのでしょうか? テーブルAと同じ型のaを作る という意味なのでしょうか??

  • まったく別のテーブルの結果MYSQL

    table_1 id name age table_2 id book title city day SELECT * FROM table_1 WHERE id=? SELECT book,title FROM table_2 WHERE city=? このようにまったく別のテーブル カラム数も違う WHEREの?も違う これを一つのSQL文にまとめたいのですが。 UNIONなどを使ってもうまくいきませんでした。 ご教授お願いいたします。

    • ベストアンサー
    • MySQL
  • distinct をexistsに変換する

    distinctをexistsに変換した方がパフォーマンスが良いようで、 例えば以下の例があるとします ---------------------------------- (前)SELECT DISTINCT a.ID1, a.NAME1 FROM TABLE1 a, TABLE2 b WHERE a.ID1 = b.ID2 (後)SELECT a.ID1, a.NAME1 FROM TABLE1 a    WHERE EXISTS ( SELECT 'X' FROM TABLE2 b WHERE a.ID1 = b.ID2) ---------------------------------- もっと複雑なSQLの場合、EXISTSに変換できるのでしょうか?。複雑なSQLとは、 「複数のテーブルからカラムを取得」「テーブル結合が2つ以上」「外部結合」 などのSQLで、以下に例を示します。 (例)SELECT DISTINCT a.ID1,a.NAME1,b.ID2,b.NAME2,c.ID3,c.NAME3    FROM TABLE1 a,TABLE2 b,TABLE3 c    WHERE a.ID1 = b.ID1(+)      AND a.ID1 = c.ID1(+)

  • テーブル上に存在しないデータの一覧を取りたい。

    mysql+phpで開発を行っています。 テーブル id 101 102 104 106 109 110 の様にデータが入っているテーブルaaaがあります。 プログラムで取得したid一覧が上記テーブルにレコードがあるのか確認するSQLは 例)select id from aaa where id in (101,102) で取得できるということは分かっています。 ここで select id from aaa where id in (102,103) とやると102の1件が取得できます。 今回知りたいことは 逆に取得できなかった103という値を取得する方法はないのかという事です。 select id from aaa where id=102; select id from aaa where id=103; 2回SQLを実行して値が戻ってこないSQL=テーブルにそのレコードが無いというプログラムを書けばいい事は分かっています。 しかし、処理が少なくとも数千回発生してしまう予定ですのでできれば別の方法がいいと思っています。 また、in区で使っている一覧はテーブルには入っておらず、また、こちらも数千個あるので、一時テーブルに入れるといってもかなりの時間がかかってしまうと思います。 何か一発で取得できるいい方法などありますでしょうか? ちなみにaaaテーブルは5万件ほどなので全件php側でメモリに展開してサーチも避けたいです よろしくお願いいたします。

  • 別テーブルからSELECTした値を持つ行を削除するSQLは?

    削除 SQL がわかりません。 SQL-1 SELECT id FROM table2 WHERE date_in IS NULL; これで取得したidを持つレコード(別テーブル)を削除したいのですが、 どうすれば組み合わさるのでしょうか? DELETE FROM table1 WHERE id=???

  • テーブル名を*で検索できますか?

    同じ構造のテーブルが10個ぐらいあるのですが、 どのテーブルのカラムidに'001'が入っているかを SQLだけで検索することは可能でしょうか? 以下のようにやってみましたが駄目でした。 select * from log_0* where id='001' オラクルならできるなどでもOKです。 よろしくお願いします。

  • テーブルを結合

    テーブルの結合に関して質問します。 ネットなどでinner joinを使った複数のテーブル結合が参考として 書いてあったのですが(3つまで), 4つテーブルを結合する事は 出来るのでしょうか? A,B,CテーブルにはID,NAMEがあります。 DテーブルにはA,B,CテーブルのIDがあります。 参考サイトを見て3つのテーブルを結合するSQLが以下になります。 SELECT a.name, b.name, c.name FROM a INNER JOIN (b INNER JOIN c ON b.id = c.id) ON a.id = c.id よろしければアドバイスお願いします。

  • テーブルの行を増やしたい・・・。

    テーブルの行を増やし、 データを一年文作成したいのですが・・・。 CREATE TABLE CALENDAR_TBL( YYYYMMDD DATE NOT NULL, DayData NUMBER(3) NULL CONSTRAINT CALENDAR_TBL_PKEY PRIMARY KEY(YYYYMMDD)); このテーブルに、2005年のデータ365レコードを挿入したいのですが、 1つのINSERT文(SQL)で、できますでしょうか? (※PL/SQLは除きます。) ※不可能であれば、SELECT文(下記のように)を一年分用意してUNIONで作成するのですが、 これ以外に簡単にできないでしょうか? INSERT INTO CALENDAR_TBL ( (SELECT SYSDATE + 000, DayData FROM CALENDAR_TBL) UNION (SELECT SYSDATE + 001, DayData FROM CALENDAR_TBL) UNION (SELECT SYSDATE + 002, DayData FROM CALENDAR_TBL) UNION (SELECT SYSDATE + 003, DayData FROM CALENDAR_TBL) ・・・(省略)・・・ UNION (SELECT SYSDATE + 365, DayData FROM CALENDAR_TBL) )