ПРИСОЕДИНЯЙТЕСЬ для определенного номера строки

Я использую 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 в рамках пункта JOIN. Не могли бы вы предоставить полный запрос? а также добавьте несколько простых данных и ожидаемый результат

SelVazi 26.02.2024 10:51

Просто выберите и другие столбцы select * from (select *, row_number() ....

Charlieface 26.02.2024 11:41

@Charlieface Это само по себе ничего не меняет в синтаксической ошибке, показанной OP. Разумно подозревать, что существует множество дубликатов или похожих тем, но я не думаю, что именно эта тема является подходящим кандидатом для ссылки на эту; выбранный вами поток предназначен для Microsoft SQL Server, он не связан с нумерацией страниц и не обсуждает попытки сделать это как часть цепочки соединений.

Zegarek 26.02.2024 11:56

@Zegarek Я пытался сказать, что второй запрос сработал бы, просто в нем не хватало *. Настоящий ответ — не пытаться исправить первый запрос, а полностью его переписать. Я изменил дубликат ссылки на более подходящую для Postgres.

Charlieface 26.02.2024 12:09

@Charlieface Это ясно, и я согласен, было бы лучше увидеть полный контекст задачи и выработать решение с нуля. Дело в том, что ОП, похоже, заинтересован не просто в исправлении всего этого (которым они, похоже, не могут поделиться), но в первую очередь в том, чтобы научиться делать определенную вещь в этом конкретном контексте - это нумерация страниц, применяемая в join список. Измененная ссылка касается одного из трех поднятых мной вопросов (это должно было быть голосование за повторное открытие).

Zegarek 26.02.2024 12:20
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
6
83
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы пытаетесь разбивать на страницы. Идея, которую вы показали, синтаксически неверна, но даже если вы это исправите, ее логика все равно не совсем верна.

Если ваша цель состояла в том, чтобы использовать только первую строку из 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, у них не было возможности сопоставить их с пронумерованной копией в подзапросе. Ты

  1. Взял строки из trip_approver_snapshot
  2. Удалили их содержимое (вы не выбрали ничего, кроме row_number())
  3. Спросил обо всем этом (select *)
  4. Выкинул все это, кроме того, что под номером 1.

Все это как join условие. (select 1) избавит вас от необходимости получать одну строку с 1 в ней.

Другие вопросы по теме