Выберите в ошибке выбора FROM при попытке определить среднее значение - PullRequest
0 голосов
/ 16 сентября 2018

У меня есть таблицы:


Отзыв

  • Product_ID (FK для Product_ID в таблице продуктов)
  • Рекомендация
  • Качество(FK для Score_ID в таблице Score)
  • Значение (FK для Score_ID в таблице Score)

Score

  • Score_ID
  • Значение
  • Описание

Продукт

  • Product_ID
  • Имя
  • Цена

Подкатегория

  • SubCat_ID
  • Имя

Product Подкатегория

  • Product_ID(FK для Product_ID в таблице Product)
  • SubCat_ID (FK для SubCat_ID в таблице Subcategory)

Моя цель - создать запрос, который возвращает среднее качество и стоимость продукта, которыйнаходится в подкатегории '4K Ultra HD TVs', и цена составляет более $ 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

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018

Поэтому я просто переформатировал ваш запрос для (моей личной) читабельности и изменил способ присвоения псевдонимов:

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;

Проблема заключается в том, что в каждом подзапросе вы дважды используете одну и ту же таблицу и дважды создаете один и тот же псевдоним, что вызывает панику в вашей базе данных. Я оставил комментарий в коде, показывающий точные места.

Так что просто создайте псевдонимы, которые являются уникальными в вашем запросе, и вы будете в порядке.

0 голосов
/ 16 сентября 2018

Ошибка указывает на =, а не AVG или на подвыбор.

Похоже, вы пытаетесь присвоить имена выбранным значениям. Синтаксис для этого не NAME = EXPR, а EXPR AS NAME (как в вашем первом столбце, R.PRODUCT_ID AS PID).

1010 * Таким образом *

    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
...