Агрегат может не отображаться в предложении WHERE, если он не находится в подзапросе - PullRequest
3 голосов
/ 13 мая 2011

Я пытаюсь использовать следующий код:

m_Set.ClearQueryInfo();
m_Set.SetParameterWhere("PatID = @PatIDParam AND EffectiveEnrollmentDate IN (Select MAX(EffectiveEnrollmentDate))");
m_Set.SetWhere("PatID = ? AND EffectiveEnrollmentDate IN (Select MAX(EffectiveEnrollmentDate))");
m_Set.SetNumParams(1);
m_Set.SetParam("@PatIDParam", 1, PatIDParam.ToString());

но я получаю следующую ошибку:

Агрегат может не отображаться в ГДЕ пункт, если он не находится в подзапрос, содержащийся в предложении HAVING или список выбора, а столбец агрегированный является внешней ссылкой, ВЫБЕРИТЕ dbo. [PatRoster]. * ОТ dbo. [PatRoster] ГДЕ PatID = @PatIDParam AND EffectiveEnrollmentDate IN (Выбрать MAX (EffectiveEnrollmentDate))

Ответы [ 5 ]

2 голосов
/ 13 мая 2011

Ваш запрос недействителен - Select MAX(EffectiveEnrollmentDate) не завершен; он должен выбрать EffectiveEnrollmentDate где-то в этом подзапросе.

Кроме того, MAX() возвращает только одно значение, поэтому IN не требуется - вы можете просто выполнить оператор прямого сравнения =.

2 голосов
/ 13 мая 2011

Вы не указываете источник таблицы для запроса отсюда:

(Select MAX(EffectiveEnrollmentDate))

Измените его на:

(Select MAX(EffectiveEnrollmentDate) FROM PatRoster)
0 голосов
/ 13 мая 2011

Вы не можете иметь агрегат в подзапросе со значениями внешнего запроса:

AND EffectiveEnrollmentDate IN (<s>Select MAX(EffectiveEnrollmentDate)</s>)

Что вы хотите сделать, это:

SELECT dbo.[PatRoster].*
  FROM dbo.[PatRoster]
 WHERE PatID = @PatIDParam
   AND EffectiveEnrollmentDate = (Select MAX(EffectiveEnrollmentDate)
                                    FROM dbo.[PatRoster]
                                   WHERE PatID = @PatIDParam)
0 голосов
/ 13 мая 2011

Подзапрос: (Select MAX(EffectiveEnrollmentDate)) не хватает источника, он не может ссылаться на внешний запрос

SELECT dbo.[PatRoster].* 
FROM dbo.[PatRoster] 
WHERE PatID = @PatIDParam AND EffectiveEnrollmentDate = (Select MAX(EffectiveEnrollmentDate) FROM dbo.[PatRoster])
0 голосов
/ 13 мая 2011

Как следует из сообщения об ошибке, правильный способ сделать это с помощью подзапроса:

select bar.foo
from bar
where bar.foo = (select max(subbar.foo) from bar as subbar); -- subquery
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...