Я использую Postgres и хотел бы выполнить объединение таблиц по определенному номеру строки.
У меня есть следующее:
LEFT JOIN trip_approver_snapshot tas ON trip.trip_id=tas.trip_id
and select * from (select row_number() over(order by id) as tas_row_num from trip_approver_snapshot) tasn where tasn.tas_row_num = 1
Чтобы попробовать получить только первую строку. (Мне также нужно будет получить строку 2 и строку 3, но сначала я просто хочу, чтобы строка 1 работала).
Однако приведенный выше запрос выдает следующую ошибку:
Ошибка SQL [42601]: ОШИБКА: синтаксическая ошибка в позиции «выбрать» или рядом с ней: 7102
Больше информации:
Если я запускаю следующее:
select
*
from
(
select
row_number() over(
order by
id
) as tas_row_num
from
trip_approver_snapshot
) tasn
where
tasn.tas_row_num = 1
Просто выберите и другие столбцы select * from (select *, row_number() ....
@Charlieface Это само по себе ничего не меняет в синтаксической ошибке, показанной OP. Разумно подозревать, что существует множество дубликатов или похожих тем, но я не думаю, что именно эта тема является подходящим кандидатом для ссылки на эту; выбранный вами поток предназначен для Microsoft SQL Server, он не связан с нумерацией страниц и не обсуждает попытки сделать это как часть цепочки соединений.
@Zegarek Я пытался сказать, что второй запрос сработал бы, просто в нем не хватало *. Настоящий ответ — не пытаться исправить первый запрос, а полностью его переписать. Я изменил дубликат ссылки на более подходящую для Postgres.
@Charlieface Это ясно, и я согласен, было бы лучше увидеть полный контекст задачи и выработать решение с нуля. Дело в том, что ОП, похоже, заинтересован не просто в исправлении всего этого (которым они, похоже, не могут поделиться), но в первую очередь в том, чтобы научиться делать определенную вещь в этом конкретном контексте - это нумерация страниц, применяемая в join список. Измененная ссылка касается одного из трех поднятых мной вопросов (это должно было быть голосование за повторное открытие).


Вы пытаетесь разбивать на страницы. Идея, которую вы показали, синтаксически неверна, но даже если вы это исправите, ее логика все равно не совсем верна.
Если ваша цель состояла в том, чтобы использовать только первую строку из trip_approver_snapshot, вы можете заменить таблицу боковым подзапросом , взяв из нее только одну строку:
LEFT JOIN LATERAL (SELECT * FROM rip_approver_snapshot AS tas
WHERE trip.trip_id=tas.trip_id
ORDER BY tas.id LIMIT 1 OFFSET 0) tas
ON TRUE
Чтобы получить только 2-ю строку, просто увеличьте OFFSET до 1. Чтобы получить третий, увеличьте его до 2 и так далее. В посте , ссылку на который я дал , обсуждается пагинация на основе LIMIT/OFFSET как интуитивно понятный, но не совсем оптимальный метод.
Есть более эффективные способы сделать это join, но лучший выбор зависит от структуры вашей таблицы, индексов и того, на что направлен ваш полный запрос, ни один из которых вы не раскрыли.
Прямо сейчас, если в первом опубликованном вами запросе вы получали данные из trip_approver_snapshot, у них не было возможности сопоставить их с пронумерованной копией в подзапросе. Ты
trip_approver_snapshotrow_number())select *)1.Все это как join условие. (select 1) избавит вас от необходимости получать одну строку с 1 в ней.
Вы не можете подать заявку
SELECTв рамках пунктаJOIN. Не могли бы вы предоставить полный запрос? а также добавьте несколько простых данных и ожидаемый результат