3

マスター、子、孫として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 のインライン ビューに問題 (バグまたは機能) がありますか?

4

2 に答える 2

1

注意すべき点は、クエリで * を選択すると、オラクルが自動的に time_stamp 列に time_stamp、time_stamp_1、time_stamp_2 という名前を付けると思います。

where句にはtime_stamp =があり、これはtime_stampをtable1.time_stampとリンクしているため機能します。

以下のSQLを実行すると、上記の列名が出力に表示されます

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')
于 2014-02-04T09:37:41.277 に答える