マスター、子、孫として3つのテーブルがあります。このような単純化されたもの:
CREATE TABLE TABLE1
(
ID NUMBER(10) NOT NULL,
TIME_STAMP DATE NOT NULL,
COL1 VARCHAR2(64 CHAR) NOT NULL
)
CREATE TABLE TABLE2
(
ID NUMBER(10) NOT NULL,
TIME_STAMP DATE NOT NULL,
TABLE1_ID NUMBER(10) NOT NULL,
COL2 VARCHAR2(64 CHAR) NOT NULL,
)
ALTER TABLE TABLE2 ADD (
CONSTRAINT TABLE2_FK
FOREIGN KEY (TABLE1_ID)
REFERENCES TABLE1 (ID))
/
CREATE TABLE TABLE3
(
ID NUMBER(10) NOT NULL,
TIME_STAMP DATE NOT NULL,
TABLE2_ID NUMBER(10) NOT NULL,
COL3 VARCHAR2(255 CHAR) NOT NULL
)
ALTER TABLE TABLE3 ADD (
CONSTRAINT TABLE3_FK
FOREIGN KEY (TABLE2_ID)
REFERENCES TABLE2 (ID))
/
より大きなクエリでは、これら 3 つのテーブルを次のようなインライン ビューに結合します。
SELECT * FROM (
SELECT *
FROM table3 tbl3
JOIN table2 tbl2
ON tbl3.table2_id = tbl2.id
JOIN table1 tbl1
ON tbl2.table1_id = tbl1.id
WHERE tbl2.col2 = 'SOME_CODE'
AND tbl1.col1 = 'SOME_CODE'
AND tbl3.time_stamp > TO_DATE('20130901','YYYYMMDD')
) WHERE time_stamp < :query_date
私の問題は、where 句で参照する time_stamp を指定しなかったことです。驚いたことに、エラーは発生しませんでしたが、代わりにデータベースは列 table1.time_stamp を使用することにしました! 私の最初の質問は、「ORA-00918: 列があいまいに定義されています」というメッセージが表示されない理由があるのですか? 問題を見つけるのに少し時間がかかりましたが、見つけたら、インラインビューの選択で、この場合tbl3.time_stampで興味のある列を指定することで簡単に修正できました。テスト時に、列リストに time_stamp を 2 つ含めると、予想どおり ORA-00918 が発生することがわかりました。
助けてください。ここで何か不足していますか、それとも Oracle 11 のインライン ビューに問題 (バグまたは機能) がありますか?