2011-08-19 74 views
0

我觉得这个应该是很容易,但我努力从内部联接选择返回最高结果。这是查询条件:Oracle 10g内部加入限制条款?

SELECT * FROM (
    SELECT * 
    FROM PROCESS_OWNER.ARTIFACTS, PROCESS_OWNER.ARTIFACT_METADATA 
    WHERE ARTIFACTS.ARTIFACT_ID = ARTIFACT_METADATA.ARTIFACT_ID 
    AND ARTIFACTS.ARTIFACT_LABEL = 'getDBStatus' 
    ORDER BY ARTIFACTS.REGISTERED_TIMESTAMP DESC 
) 
WHERE ROWNUM = 1 

数据库是Oracle 10g。我得到的错误是:00918. 00000 -

内查询工作正常“定义的含糊栏” - returing有38个记录TIMESTAMP下令,我只是想最近的(上一个)

感谢您的任何帮助

回答

2

你内心的查询将返回两列称为ARTIFACT_ID - 从每个表。当你在另一个选择中嵌套时,它会导致你看到的错误。您需要在内部选择中明确列出所需的列。

奇怪的是,似乎如果你把它用ANSI重新写加盟,它的工作原理:

SELECT * FROM (
    SELECT * 
    FROM PROCESS_OWNER.ARTIFACTS 
    JOIN PROCESS_OWNER.ARTIFACT_METADATA 
    ON ARTIFACTS.ARTIFACT_ID = ARTIFACT_METADATA.ARTIFACT_ID 
    WHERE ARTIFACTS.ARTIFACT_LABEL = 'getDBStatus' 
    ORDER BY ARTIFACTS.REGISTERED_TIMESTAMP DESC 
) 
WHERE ROWNUM = 1 
+0

完美!谢谢!非常奇怪的是,它的工作原理是这样的...最后一件事 - 两个ARTIFACT_ID列返回为“QCSJ_C0000000000004000001”和“QCSJ_C0000000000004000000”有无论如何,我可以重命名他们(或至少一个)? – rwb

+4

你回来了,不得不在内部查询中指定** all **所需的列名。 –

2

必须有一个与ATRIFACTS和ARTIFACT_METADATA共同(名称)的列。

这在内部查询本身中是可以的,但是当外部查询来为列指定名称时会发生冲突。

尝试命名内部查询列具体(命名类似命名的列的东西不同),它应该工作正常。

更妙的是,只选择你绝对需要在内部查询,而不是选择列*

+0

感谢您的答复。我不得不明确地列出这些列名 - 这是有效的,但这是一种正确的痛苦。有没有更好的办法?将使用row_number()/一个分析函数有什么区别? – rwb

+1

@Ryan:尝试用ANSI JOIN语法重写 - 请参阅我更新的答案。 –

+0

除了Tony发现可以使用ANSI语法连接之外,您可以使用相关的子查询,但这会导致额外的开销。 – Ollie