#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 Пожалуйста, посмотрите мою правку, я добавил более простой запрос, который делает то же самое