Сравнение COUNT с INTERSECT - PullRequest
       7

Сравнение COUNT с INTERSECT

0 голосов
/ 22 ноября 2018

Я пытаюсь реплицировать оператор .NET All в SQL, но борюсь с синтаксисом.У меня есть запрос:

Запрос 1

SELECT ExamId FROM UserExam where UserId = @UserId 

Запрос 2

SELECT ExamId FROM Paper u2 JOIN UserPaper uu2 ON uu2.PaperId = u2.Id
WHERE uu2.UserId = u.id

Я хочу проверить,ВСЕ элементы из запроса № 2 присутствуют в запросе № 1.Вот что у меня есть:

... AND
(SELECT COUNT(*) FROM
    (SELECT ExamId FROM UserExam where UserId = @UserId 
    INTERSECT
    SELECT ExamId FROM Paper u2 JOIN UserPaper uu2 ON uu2.PaperId = u2.Id
    WHERE uu2.UserId = u.id)
    I = (SELECT COUNT(*) c FROM UserExam where UserId = @UserId)
)

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

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Ваши группировки только что сгорели.Вам необходимо добавить ) после псевдонима I, а затем удалить его с конца.

Сейчас он сравнивает предложение FROM в первой части со вторым запросом вместо сравнения двух значений.

В настоящее время:

(SELECT COUNT(*) FROM
    (SELECT ExamId FROM UserExam where UserId = @UserId 
    INTERSECT
    SELECT ExamId FROM Paper u2 JOIN UserPaper uu2 ON uu2.PaperId = u2.Id
    WHERE uu2.UserId = u.id)
    I = (SELECT COUNT(*) c FROM UserExam where UserId = @UserId)
)

Должно быть:

(SELECT COUNT(*) FROM
    (SELECT ExamId FROM UserExam where UserId = @UserId 
    INTERSECT
    SELECT ExamId FROM Paper u2 JOIN UserPaper uu2 ON uu2.PaperId = u2.Id
    WHERE uu2.UserId = u.id)
    I) = (SELECT COUNT(*) c FROM UserExam where UserId = @UserId)
0 голосов
/ 22 ноября 2018

Исходя из вашего комментария, вы просто не используете псевдоним результат подзапроса.

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

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

 SELECT 1  =  SELECT 2   -- syntax error
(SELECT 1) = (SELECT 2)  -- good syntax, evaluates to FALSE

Итак ...

(
  SELECT
    COUNT(*)
  FROM
  (
    SELECT ExamId FROM UserExam where UserId = @UserId 
    INTERSECT
    SELECT ExamId FROM Paper u2 JOIN UserPaper uu2 ON uu2.PaperId = u2.Id
      WHERE uu2.UserId = u.id
  )
    AS alias_for_the_intersection
)
=
(
  SELECT COUNT(*) c FROM UserExam where UserId = @UserId
)
...