我是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
答案 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
.....