Oracle选择查询,Order By + Limit结果



我是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

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

您还希望在该列上连接。此时,您正在生成两个表之间的交叉连接。换句话说,如果在EAI_EVENT_LOG中有100条记录,在EAI_EVENT_LOG_MESSAGE中有200条记录,那么结果集将是20,000条记录(不包含行数)。这可能就是你的意图。


"通过切换到innerjoin,会消除错误吗?当前代码?"

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

也许你有一些列在EAI_EVENT_LOG和EAI_EVENT_LOG_MESSAGE表具有相同的名称?代替SELECT *,列出你想要选择的所有列。

我看到的另一个问题是,您正在从两个表中进行选择,但您没有在WHERE子句中连接它们,因此结果集将是这两个表的外积。

您需要停止使用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
.....

最新更新