ORA-00918:列模糊定义

时间:2016-05-08 08:33:19

标签: sql oracle

我想显示供应商名称和由供应商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错误。我该如何解决?

2 个答案:

答案 0 :(得分: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,因此您的查询永远不会返回任何行。

答案 1 :(得分:0)

以下是编写查询时的一些有用指南:

  • 提供表名称缩写的所有表别名。
  • 通过包含表名来限定所有列名。
  • 永远不要在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中删除产品代码。如果您想要按产品分类,请在两个地方都包含产品代码。