PriyavartRajain Ответов: 3

Как мне избавиться от этой ошибки? SQL Server


Это SQL-запрос, который я пытаюсь выполнить, Reviewer.rEmail и PAPER_REVIEW.reviewerId имеют одинаковые записи, и я хочу сделать отдельный столбец из этих целых чисел, но я продолжаю получать ошибку ниже:

select REVIEWER.rEmail from REVIEWER where REVIEWER.rEmail in (select PAPER_REVIEW.reviewerId, AVG(PAPER_REVIEW.score) AS AVG_SCORE from PAPER_REVIEW group by PAPER_REVIEW.reviewerId
having AVG(PAPER_REVIEW.score) >= 6);


Только одно выражение может быть указано в списке выбора, если подзапрос не представлен с помощью EXISTS.

Что я уже пробовал:

Я не знаю, как это исправить, я пробовал использовать with, но это дало мне синтаксическую ошибку. Кто-нибудь, пожалуйста, помогите.

3 Ответов

Рейтинг:
9

Maciej Los

Когда вы используете предложение IN, вы должны указать поле в подзапросе, которое соответствует левой стороне выражения.
Итак, этот запрос:

where REVIEWER.rEmail in (select PAPER_REVIEW.reviewerId, AVG(PAPER_REVIEW.score)

пытается сравнивать rEmail к несравненным полям reviewerId и AVG(PAPER_REVIEW.score).

Для получения более подробной информации, пожалуйста, смотрите:
Видеть:
IN (Transact-SQL) - SQL Server | Microsoft Docs[^]
EXISTS (Transact-SQL) - SQL Server | Microsoft Docs[^]

Кажется, вы хотите получить средний балл от PAPER_REVIEW Итак, вам нужно использовать ПРИСОЕДИНИТЬСЯ[^].

SELECT rv.rEmail, AVG(pr.score) AS AVG_SCORE
FROM REVIEWER rv INNER JOIN PAPER_REVIEW pr ON rv.reviewerId = pr.reviewerId
GROUP BY rv.rEmail
HAVING AVG(pr.score) >= 6;


MadMyche

+5 Это то, что я думаю, что OP тоже ищет, как только я отформатировал беспорядок кода, который был опубликован

Maciej Los

Спасибо вам за 5!
Спасибо за форматирование вопроса ОП. Читать его было гораздо легче.

MadMyche

Никакой благодарности не требовалось, так как это был не я и уж точно не мой стиль набора текста

Maciej Los

Упс...
В любом случае, спасибо.

MadMyche

:)

Рейтинг:
28

David_Wimbley

Сам ваш запрос не имеет смысла, поэтому я не совсем уверен, что вы пытаетесь сделать. Учитывая, что у нас нет доступа к вашему коду, компьютер, и мы ничего не знаем о вашем проекте, я попытаюсь направить вас в общем направлении.

Во-первых, ваш запрос использует предложение where, где вы пытаетесь получить все значения rEmail, которые появляются в подзапросе. У вас тут есть несколько проблем.

Подзапрос может возвращать только 1 значение в сочетании с "IN", а вы возвращаете 2.

Ваша вторая проблема заключается в том, что вы ищете, где находится rEmail IN, но ваши 2 столбца, в которых вы пытаетесь выполнить поиск, - это столбец Id и агрегат, которые не имеют ничего общего с адресом электронной почты.

С учетом сказанного ниже приводится общая идея с примером схемы того, что вам нужно сделать.

DECLARE @Reviewer TABLE (
   rEmail varchar(200) NULL
);

DECLARE @PaperReviewer TABLE (
   rEmail varchar(200) NULL
);

INSERT @Reviewer (rEmail) VALUES ('Test1');
INSERT @Reviewer (rEmail) VALUES ('Test2');
INSERT @PaperReviewer (rEmail) VALUES ('Test2');

SELECT * FROM @Reviewer WHERE rEmail IN (SELECT rEmail FROM @PaperReviewer);


Приведенный выше пример будет работать (при условии, что я ничего не толстил пальцем, не запускал его сам) в том смысле, что вы должны видеть только Test2, возвращаемый в этом запросе.

Ваша альтернатива-использовать предложение WHERE / EXISTS, если вам нужно просмотреть запись по нескольким столбцам.

Учитывая, что вы использовали предложение IN, я не буду идти по этому пути, так как думаю, что ваша проблема заключается в том, что вы, вероятно, либо новичок в sql, либо не понимаете свою схему.

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


Рейтинг:
12

PIEBALDconsult

Как насчет чего-то вроде этого:

DROP TABLE #REVIEWER
;
SELECT *
INTO #REVIEWER
FROM
(
  SELECT 1 ID , 'email1@foo.bar' Email
  UNION ALL
  SELECT 2 ID , 'email2@foo.bar' Email
) T
;
SELECT * FROM #REVIEWER
;
DROP TABLE #REVIEW
;
SELECT *
INTO #REVIEW
FROM
(
  SELECT 1 ID , 4.2 Score
  UNION ALL
  SELECT 2 ID , 6.9 Score
) T
;
SELECT * FROM #REVIEW
;


WITH review AS
(
  SELECT ID
  FROM
  (
    SELECT ID
    , AVG ( Score ) AvgScore
    FROM #REVIEW
    GROUP BY ID
  ) T
  WHERE AvgScore >= 6
)
SELECT A.*
FROM #REVIEWER A
JOIN review B
ON A.ID = B.ID