#sql-server
#sql-сервер
Вопрос:
Я выполняю этот код в postgresql, и он выполняется нормально.
SELECT t.anonymous_id AS anonym_id,
(select event_name
from tracks t1
where t1.anonymous_id = t.anonymous_id and user_id is null order by received_at desc limit 1) as last_null,
(select event_name
from tracks t2
where t2.anonymous_id = t.anonymous_id and user_id is not null ) as first_notnull
FROM tracks t
GROUP BY anonym_id
ORDER BY anonym_id;
Затем я снова записываю его в sql server и получаю некоторые ошибки. После попытки исправления мой код выглядит следующим образом:
SELECT t.anonymous_id AS anonym_id
FROM tracks t
JOIN
(select event_name
from tracks t1
where t1.anonymous_id = anonymous_id and user_id is null order by received_at desc offset 0 rows) as last_null,
(select event_name
from tracks t2
where t2.anonymous_id = anonymous_id and user_id is not null) as first_notnull
GROUP BY anonym_id
ORDER BY anonym_id;
В настоящее время я получил сообщение об ошибке
An expression of non-boolean type specified in context where a condition is expected near ','
Почему? И как это исправить?
Комментарии:
1. SQL Server не поддерживает,
LIMIT
он используетTOP
, с довольно другим синтаксисом. Какова ваша фактическая база данных?2. Вы не можете просто скопировать SQL из одной СУБД, а затем вставить его в другую и ожидать, что он будет работать. Все они используют разные диалекты. Вы должны «перевести» его с одного диалекта на другой. В вашем
JOIN
подзапросеlast_null
отсутствуетON
, и затем вы используете этот старый синтаксис соединения ANSI-89 дляfirst_notnull
3. Зачем переписывать в соединение? Если вы используете
top ..
вместоlimit
в первом запросе, это должно работать и с SQL Server4. Однако эти подзапросы находятся в
SELECT
вашем запросе PostgreSQL. Почему они перешли наFROM
в вашем запросе T-SQL?5. @TimBiegeleisen, я заменяю limit на использование offset. Моей фактической базой данных является sql server. Я думаю, что моя проблема заключается в использовании соединения с подзапросом в качестве конечного ответа