【问题标题】:Select within a select FROM error while trying to work out average在尝试计算平均值时在选择 FROM 错误中选择
【发布时间】:2018-09-16 12:09:07
【问题描述】:

我有桌子:


评论

  • Product_ID(产品表上 Product_ID 的 FK)
  • 推荐
  • 质量(分数表上的 Score_ID 的 FK)
  • 值(分数表上 Score_ID 的 FK)

得分

  • Score_ID
  • 价值
  • 说明

产品

  • Product_ID
  • 姓名
  • 价格

子类别

  • SubCat_ID
  • 姓名

产品子类别

  • Product_ID(产品表上 Product_ID 的 FK)
  • SubCat_ID(子类别表上的 SubCat_ID 的 FK)

我的目标是创建一个查询,返回“4K 超高清电视”子类别中产品的平均质量和价值,并且价格超过 4000 美元。我不能只返回 Score_ID,我需要返回该值的平均值(这是 Score 表中的一个字段)。

我已经为此工作了几个小时,这就是我想出的。但是,我不知道如何解决该错误。我相信这与子查询中的 AVG 函数有关,或者我使用 SELECT 的方式。

COLUMN PID FORMAT 999
COLUMN AVG_QUALITY FORMAT 99999999999
COLUMN AVG_VALUE FORMAT 99999999999

SELECT  R.PRODUCT_ID AS PID,
        AVG_QUALITY = (SELECT AVG(SQU.SCORE_VALUE)
        FROM SCORE SQU
        INNER JOIN SCORE SQU ON SQU.SCORE_ID = R.SCORE_QUALITY
        WHERE R.SCORE_QUALITY = SQU.SCORE_ID),
        AVG_VALUE = (SELECT AVG(SVA.SCORE_VALUE)
        FROM SCORE SVA
        INNER JOIN SCORE SVA ON SVA.SCORE_ID = R.SCORE_VALUE
        WHERE R.SCORE_VALUE = SVA.SCORE_ID)
FROM REVIEW R
INNER JOIN PRODUCT P ON P.PRODUCT_ID = R.PRODUCT_ID
INNER JOIN PRODUCTSUBCATEGORY PS ON PS.PRODUCT_ID = P.PRODUCT_ID
INNER JOIN SUBCATEGORY S ON S.SUBCAT_ID = PS.SUBCAT_ID
WHERE S.NAME = '4K Ultra HD TVs'
AND P.PRICE > 4000;
        AVG_QUALITY = (SELECT AVG(SQU.SCORE_VALUE)
                    *
ERROR at line 2:
ORA-00923: FROM keyword not found where expected

【问题讨论】:

  • 。 .欢迎来到堆栈溢出。请用您正在使用的数据库标记您的问题。此外,将查询作为 text 而不是图像放入问题中。这让其他人更容易理解它。
  • 提示:为什么你的第一行不是SELECT PID = R.PRODUCT_ID
  • @melpomene 。 . .投反对票并不是真正的帮助新贡献者的精神。
  • @GordonLinoff 为什么不呢?
  • 据我所知,我认为您对 SQL Server(或其他 DBMS)感到困惑。在 Oracle 中,您不会为选择中的变量赋值(tyhis 是 @melpomene 在他的评论中的意思)。

标签: sql oracle subquery average


【解决方案1】:

错误指向=,而不是AVG 或子选择。

您似乎正在尝试为您选择的值命名。其语法不是NAME = EXPR,而是EXPR AS NAME(就像您的第一列中的R.PRODUCT_ID AS PID)。

这样

    AVG_QUALITY = (SELECT AVG(SQU.SCORE_VALUE)
    FROM SCORE SQU
    INNER JOIN SCORE SQU ON SQU.SCORE_ID = R.SCORE_QUALITY
    WHERE R.SCORE_QUALITY = SQU.SCORE_ID)

应该说

    (SELECT AVG(SQU.SCORE_VALUE)
    FROM SCORE SQU
    INNER JOIN SCORE SQU ON SQU.SCORE_ID = R.SCORE_QUALITY
    WHERE R.SCORE_QUALITY = SQU.SCORE_ID)
        AS AVG_QUALITY

【讨论】:

  • 我将其更新为您的代码,但现在出现此错误:第 5 行的错误:ORA-00918:列不明确定义我还更新了 AVG_VALUE 以匹配您的逻辑
  • @carrybag94 说的是哪一栏?
  • @carrybag94 整个INNER JOIN SCORE SQU ON SQU.SCORE_ID = R.SCORE_QUALITY 行没有意义,应该删除。
  • 第 7 行出现错误:ORA-00923:FROM 关键字未在预期位置找到
【解决方案2】:

所以我只是为了(我个人的)可读性重新格式化了您的查询,并更改了别名的分配方式:

SELECT R.PRODUCT_ID AS PID
  , (   SELECT AVG(SQU.SCORE_VALUE)
        FROM SCORE AS SQU       -- This is SQU
        INNER JOIN SCORE AS SQU -- This is SQU
            ON SQU.SCORE_ID = R.SCORE_QUALITY
        WHERE R.SCORE_QUALITY = SQU.SCORE_ID) AS AVG_QUALITY
  , (   SELECT AVG(SVA.SCORE_VALUE)
        FROM SCORE AS SVA       -- This is SVA
        INNER JOIN SCORE AS SVA -- This is SVA
            ON SVA.SCORE_ID = R.SCORE_VALUE
        WHERE R.SCORE_VALUE = SVA.SCORE_ID) AS AVG_VALUE
FROM REVIEW AS R
INNER JOIN PRODUCT AS P
    ON P.PRODUCT_ID = R.PRODUCT_ID
INNER JOIN PRODUCTSUBCATEGORY AS PS
    ON PS.PRODUCT_ID = P.PRODUCT_ID
INNER JOIN SUBCATEGORY AS S
    ON S.SUBCAT_ID = PS.SUBCAT_ID
WHERE S.NAME = '4K Ultra HD TVs'
AND P.PRICE > 4000;

问题在于,在每个子查询中,您使用同一个表两次,并且两次创建完全相同的别名,这会使您的数据库出现恐慌。我在代码中留下了注释,显示了确切的位置。

因此,只需创建在您的查询中唯一的别名,您就会很正常。

【讨论】:

  • 第 3 行出现错误:ORA-00907:缺少右括号
猜你喜欢
  • 2021-12-08
  • 1970-01-01
  • 2016-09-04
  • 2020-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-20
相关资源
最近更新 更多