我有三张桌子作为主人,孩子和孙子。简化如下:
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))
/
在一个更大的查询中,我将这三个表加入到这样的内联视图中:
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: column ambiguously defined”?我花了一些时间来发现问题,但是当找到问题时,可以通过在内联视图的选择中指定我在这种情况下感兴趣的列 tbl3.time_stamp 来轻松纠正。在测试时,我确实发现如果我在列列表中包含两个 time_stamp,那么正如预期的那样,我将得到 ORA-00918。
请帮帮我,我在这里遗漏了什么还是 Oracle 11 中的内联视图存在一些问题(错误或功能)?