Что не так с этим простым запросом SQL Server 2008 R2? Выдает ошибку «выражение не логического типа …»

#sql-server-2008 #having-clause

#sql-server-2008 #предложение having

Вопрос:

Я пытаюсь выбрать единственную строку из ответов таблицы, которая удовлетворяет нескольким условиям И имеет самую последнюю дату в поле update_datetime. (На самом деле мне нужны ВСЕ поля из строки ответов, но я соглашусь только на его response_uuid .)

Моя попытка выполнить этот запрос, приведенная ниже, выдает ошибку «Выражение не логического типа, указанное в контексте, где ожидается условие, рядом с ‘)'». Что, черт возьми, я делаю не так?

 select response_uuid, MAX(update_datetime) 
from Responses 
where question_id=2115
and session_uuid in (
  select session_uuid from Sessions
  where client_uuid = '552782A2-4DC6-4715-B278-4C7F5F867975'
)
group by response_uuid
having MAX(update_datetime)
  

Я смотрел на похожие вопросы по всему Интернету, и я просто не вижу, в чем проблема. Спасибо за любую помощь!

p.s. На самом деле это небольшая часть гораздо большего запроса, если вам интересно увидеть все это целиком или если просмотр всего этого был бы полезен.

Комментарии:

1. Было бы полезно увидеть все это.

2. Я должен был сказать: «Это БУДЕТ частью гораздо большего запроса, если я смогу заставить этот бит работать». Можете ли вы увидеть, что может вызвать ошибку, которую я получаю только в этом фрагменте?

Ответ №1:

Проблема здесь:

 having MAX(update_datetime)
  

Ожидается логическое выражение (что-то логически истинное или ложное), например MAX(update_datetime) = <something> . У вас нет выражения, которое оно может оценить как true или false, потому что вам не с чем сравнивать.

Судя по вашему запросу (если я чего-то не вижу), вы можете просто HAVING полностью удалить. В GROUP BY MAX совокупности должно дать вам то, что вы хотите. (Я бы посоветовал вам назвать результирующий столбец, используя что-то вроде MAX(update_datetime) AS MaxDateTime для ясности.)

Комментарии:

1. 1 Я тоже не вижу HAVING здесь смысла, иначе он используется для установки ограничений на агрегацию. Если OP просто хочет TOP 1 , чтобы он просто сказал, что

2. После добавления этого последнего абзаца я увидел, что OP может захотеть добавить столбцы позже, что означает, что HAVING может потребоваться. Если это так, то, вероятно, потребуется подзапрос (подсказка к OP здесь), аналогичный HAVING MAX(x) = (SELECT MAX(x) FROM table WHERE ... or a CTE .

3. Отзывы, которые я получил, помогли мне понять, что мне нужно сделать в моем более крупном запросе. Большое спасибо всем респондентам!