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;

请注意,这会从SELECTGROUP BY 中删除产品代码。如果您想要按产品列出的详细信息,请在两个位置都包含产品代码。

【讨论】:

以上是关于ORA-00918: 列定义不明确的主要内容,如果未能解决你的问题,请参考以下文章

ORA-00918: 列定义不明确

ORA-00918: 使用数据透视时列定义不明确

Oracle Live SQL 中的错误 -> ORA-00918:列定义不明确

Oracle Pivot 和 Pivot XML - ORA-00918:列定义不明确

ORA-00918: FOR pharmacyschema.sql (RX 药房数据库) 的列定义不明确

ORA-00918: 未明确定义列