Oracle Select Query,Order By + Limit Results

时间:2011-08-29 14:29:10

标签: oracle oracle11g

我是Oracle新手并且使用相当大的数据库。我想执行一个查询,它将选择所需的列,按某列排序,并限制结果。根据我读过的所有内容,以下查询应该正常工作,但它返回“ORA-00918:列模糊定义”:

SELECT * FROM(SELECT * FROM EAI.EAI_EVENT_LOG e, 
     EAI.EAI_EVENT_LOG_MESSAGE e1 WHERE e.SOURCE_URL LIKE '%.XML' 
     ORDER BY e.REQUEST_DATE_TIME DESC) WHERE ROWNUM <= 20

任何建议都将不胜感激:D

3 个答案:

答案 0 :(得分:6)

错误消息表示您的结果集包含两个具有相同名称的列。查询投影中的每一列都需要具有唯一名称。据推测,您在EAI_EVENT_LOG和EAI_EVENT_LOG_MESSAGE中都有一个同名的列(或列)。

您还想加入该专栏。目前,您正在两个表之间生成交叉连接。换句话说,如果您在EAI_EVENT_LOG中有一百条记录和两百条记录EAI_EVENT_LOG_MESSAGE,那么您的结果集将是两万条记录(没有rownum)。这可能是你的意图。


  

“通过切换到innerjoin,将消除错误   目前的代码?“

不,你仍然需要处理两个具有相同名称的列。基本上这来自于在两个多个表上使用SELECT *SELECT *是不好的做法。这很方便,但最好在查询的投影中指定所需的确切列。这样您就可以包含(比方说)e.TRANSACTION_ID并排除e1.TRANSACTION_ID,并避免使用ORA-00918例外。

答案 1 :(得分:2)

也许你在EAI_EVENT_LOG和EAI_EVENT_LOG_MESSAGE表中都有一些具有相同名称的列?而不是SELECT *列出您要选择的所有列。

我看到的其他问题是你从两个表中选择但是你没有在WHERE子句中加入它们,因此结果集将是这两个表的叉积。

答案 2 :(得分:1)

您需要停止使用SQL '89隐式连接语法 不是因为它不起作用,而是因为它是邪恶 现在你有一个cross join,其中99.9%的情况不是你想要的。 此外,每个子选择都需要拥有自己的别名。

SELECT * FROM
(SELECT e.*, e1.* FROM EAI.EAI_EVENT_LOG e
 INNER JOIN EAI.EAI_EVENT_LOG_MESSAGE e1 on (......)
 WHERE e.SOURCE_URL LIKE '%.XML' 
 ORDER BY e.REQUEST_DATE_TIME DESC) s WHERE ROWNUM <= 20

请在虚线上指定连接标准。

通常你在关键字段上进行加入,例如ON (e.id = e1.event_id)

使用select *是个坏主意,最好准确指定您想要的字段:

SELECT e.field1 as customer_id
       ,e.field2 as customer_name
.....