【问题标题】:Simple SQL query getting "ORA-00918: column ambiguously defined"?获取“ORA-00918:列不明确定义”的简单 SQL 查询?
【发布时间】:2018-03-12 15:31:29
【问题描述】:

我只是想从一列中获取金额。

SELECT SUM(amount_usd)
FROM WIRE_MSTR, TRANS_MSTR
INNER JOIN WIRE_MSTR ON WIRE_MSTR.trans_id = TRANS_MSTR.trans_id
WHERE WIRE_MSTR.dest_cntry = 'CANADA' AND TRANS_MSTR.trans_yyyymm = '201510';

但在第 4 行我收到错误“ORA-00918:列不明确定义”。 我已经参考了所有内容,可能是什么问题?

【问题讨论】:

  • 能否包含用于定义表的 SQL 语句?
  • Oracle 错误来自 Oracle,而不是 MySQL。
  • 当涉及多个表时,限定所有列! (例如SUM(tablename.amount_usd)。)

标签: sql oracle


【解决方案1】:

您正在使用隐式和显式连接语法。您应该删除隐式语法:

SELECT SUM(amount_usd)
FROM TRANS_MSTR
INNER JOIN WIRE_MSTR ON WIRE_MSTR.trans_id = TRANS_MSTR.trans_id
WHERE WIRE_MSTR.dest_cntry = 'CANADA' AND TRANS_MSTR.trans_yyyymm = '201510';

问题是,您的 FROM 子句中有两次 WIRE_MSTR

【讨论】:

  • 又一个 Oracle 问题通过使用正确的语法解决了。那些逗号连接就像一场瘟疫。
  • @JacobH 确实,每次当 sql 学生使用这些连接发布查询时,我都会感到惊讶。这些还教吗?
  • 是的,他们还在学习。如果你也去 reddit 的“sql”子论坛,经常会有类似“我的老师给我们这个查询......”这样的帖子使用逗号连接。它非常在学校仍然教不正确。我什至看到有人声称他们比显式语法,当然没有数据支持。
  • @Jacob & Honey:仍然有不接受 ANSI 连接的 Oracle 工具(例如 Reports Developer 10g,更不用说旧的了),而您只是必须使用旧语法。不是报告说“起床!那是什么?”对于 ANSI 连接 - 不,它会崩溃并从屏幕上消失,就好像它被分解了一样。所以...
  • 听起来甲骨文已经过时并且过时了。也许他们应该尝试改变这一点?过时 26 年没有任何借口。
【解决方案2】:

试试这个。您获得了两次 WIRE_MSTR。

SELECT SUM(amount_usd)
FROM TRANS_MSTR
INNER JOIN WIRE_MSTR ON WIRE_MSTR.trans_id = TRANS_MSTR.trans_id
WHERE WIRE_MSTR.dest_cntry = 'CANADA' AND TRANS_MSTR.trans_yyyymm = '201510';

【讨论】:

  • Umpf... 太晚了
猜你喜欢
  • 1970-01-01
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多