ORA-00918: 列定义不明确
Posted
技术标签:
【中文标题】ORA-00918: 列定义不明确【英文标题】:ORA-00918: Column ambiguously defined 【发布时间】:2016-05-08 08:33:18 【问题描述】:我想显示供应商 21344 和 24288 提供的产品所产生的供应商名称和总销售额。
这是我的查询:
SELECT v_name,PRODUCT.p_code, SUM(line_units*line_price)
FROM VENDOR, PRODUCT, LINE
WHERE VENDOR.v_code = PRODUCT.v_code
AND PRODUCT.p_code = LINE.p_code
AND VENDOR.v_code = 21344 AND VENDOR.v_code= 24288
GROUP BY v_code;
我不知道这段代码是否正确,但我收到了ORA-00918
错误。我该如何解决?
【问题讨论】:
您的 group-by 子句没有说明v_code
来自哪个表。最好用 rable is from 来限定每一列,即使它不是模棱两可的。您可以使用表别名使其更易于阅读。 (另外,请使用 ANSI 连接;您将找不到任何记录,因为 v_code
不能同时有两个值 - 您需要 OR 或 IN)。
【参考方案1】:
ORA-00918
错误的含义非常简单:有多个表具有相同的列名。在这种情况下,每当我们引用列名来识别我们想要的实例时,我们都必须使用表别名。
您在为 WHERE 子句中的列引用别名方面非常严格,但您错过了 GROUP BY 中的那个。这里我用 VENDOR 给它起了别名:
SELECT v_name,PRODUCT.p_code, SUM(line_units*line_price)
FROM VENDOR, PRODUCT, LINE
WHERE VENDOR.v_code = PRODUCT.v_code
AND PRODUCT.p_code = LINE.p_code
AND VENDOR.v_code in ( 24288, 21344)
GROUP BY VENDOR.v_code;
请注意,我还修复了VENDOR.v_code
上的过滤器;显然x = 1 AND x = 2
的计算结果为 false,因此您的查询永远不会返回任何行。
【讨论】:
但是用户问题没有得到错误的输出,而是得到了错误。 @sql_dummy - 编译错误胜过逻辑错误。我已经在我的回答中解决了 ORA-00918 错误。我也简单地修复了逻辑错误。【参考方案2】:以下是编写查询时的一些有用指南:
为所有表提供作为表名称缩写的别名。 通过包含表名来限定所有列名。 切勿在FROM
子句中使用逗号; 总是使用明确的JOIN
语法。
在GROUP BY
中包含所有非聚合列。
如果您正在学习 SQL 而没有学习这些或类似的指南,那么您(很遗憾)没有可以学习的好材料。
如果我们将此应用于您的查询:
SELECT v.v_name, SUM(l.line_units * l.line_price)
FROM VENDOR v JOIN
PRODUCT p
ON v.v_code = p.v_code JOIN
LINE l
ON p.p_code = l.p_code
WHERE v.v_code IN (21344, 24288)
GROUP BY v.v_name;
请注意,这会从SELECT
和GROUP BY
中删除产品代码。如果您想要按产品列出的详细信息,请在两个位置都包含产品代码。
【讨论】:
以上是关于ORA-00918: 列定义不明确的主要内容,如果未能解决你的问题,请参考以下文章
Oracle Live SQL 中的错误 -> ORA-00918:列定义不明确
Oracle Pivot 和 Pivot XML - ORA-00918:列定义不明确