соединение по левому краю и возврат только последней записи из правой таблицы

#sql #postgresql #left-join

#sql #postgresql #соединение по левому краю

Вопрос:

и просто не работает то, что мне нужно привести последнюю строку правой таблицы, которую я называю second_table

 table_one:
id
user_id

second_table
id
payment_instrument_id



select p_i.id, p_i.user_id,  a_r.id, a_r.table_one_id 
from table_one p_i
left join (
  select a_r.table_one_id, max(a_r.id) id
  from second_table a_r
  group by a_r.table_one_id
) lastSD on lastSD.table_one_id = p_i.id
left join second_table a_r on a_r.table_one_id = lastSD.table_one_id  
  

Ответ №1:

JOIN Условие для вашего соединения с second_table неверно; вам нужно присоединиться к обоим payment_instrument_id и id получить только последнюю строку:

 select p_i.id, p_i.user_id,  a_r.id, a_r.payment_instrument_id 
from payment_instruments p_i
left join (
  select a_r.payment_instrument_id, max(a_r.id) id
  from second_table a_r
  group by a_r.payment_instrument_id
) lastSD on lastSD.payment_instrument_id = p_i.id
left join second_table a_r on a_r.payment_instrument_id = lastSD.payment_instrument_id and a_r.id = lastSD.id  
where p_i.user_id = 1030
  

Вывод (для усеченной выборки ваших данных):

 id      user_id     id  payment_instrument_id
803     1030        86  803
958     1030        
  

Обратите внимание, что вы можете упростить свой код с помощью CTE, используя ROW_NUMBER() :

 WITH a_r AS (
  SELECT id,
         payment_instrument_id,
         ROW_NUMBER() OVER (PARTITION BY payment_instrument_id ORDER BY id DESC) AS rn
  FROM second_table
)
SELECT p_i.id, p_i.user_id, a_r.id, a_r.payment_instrument_id 
FROM payment_instruments p_i
LEFT JOIN a_r ON a_r.payment_instrument_id = p_i.id AND a_r.rn = 1
  

Результат такой же, как и при первом запросе.

Демонстрация (обоих запросов) на dbfiddle

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

1. да, отлично, спасибо за вашу помощь, работает, как и ожидалось

2. @FERNANDOORTIZ Пожалуйста, посмотрите мою правку, я добавил более простой запрос, который делает то же самое