【问题标题】:Oracle Select Query, Order By + Limit ResultsOracle Select 查询,Order By + Limit 结果
【发布时间】:2011-08-30 03:59:34
【问题描述】:

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

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

【问题讨论】:

标签: oracle oracle11g


【解决方案1】:

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

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


“通过切换到内部连接,是否可以消除错误 当前代码?”

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

【讨论】:

  • 好的,我想我明白了。你假设两个表都有一个类似的列(TRANSACTION_ID)是正确的......从你的解释来看,通过创建 tableACols^tableBCols 的数据集,我的效率非常低,我肯定会切换到内部连接。通过切换到内部连接,这会消除当前代码的错误吗? /wishIwasStillAtWorkToTry :P
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • ROWNUM 应用于结果集,而不是表。
    • 太棒了,这实际上看起来更接近我所知道和喜爱的 mySQL。只是一个问题,s 中的 s 是从哪里来的 WHERE s.ROWNUM
    • @Dave,我的错,ROWNUM 不是一个真正的列,它是一个伪列。 s 被定义,然后立即被引用。仅在真正的原因列上,而不是在伪列上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-09
    • 1970-01-01
    • 2020-11-19
    • 2011-11-20
    相关资源
    最近更新 更多