#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 aCTE
.3. Отзывы, которые я получил, помогли мне понять, что мне нужно сделать в моем более крупном запросе. Большое спасибо всем респондентам!