Если я правильно понял вопрос, вам нужна последняя дата модификации для каждого пользователя. Это сводится к проблеме наибольший-n-на-группу (с n = 1). И они обычно решаются с помощью distinct on ()
в Postgres:
select distinct on (usr.id) id, last_modified_date
from
(
select id, last_modified_date
from "User_Details"
UNION ALL
select user_id as id, last_modified_date
from "User_Contact_Details"
UNION ALL
select user_id as id, last_modified_date
from "User_Social_Media_Details"
) as usr
where last_modified_date is not null
order by id, last_modified_date desc;
В order by
внутри запросов объединения на самом деле нет необходимости, если только вы не хотите предварительно фильтровать там уже идентификаторы пользователей, что может быть более эффективным:
select distinct on (usr.id) id, last_modified_date
from
(
select distinct on (id) id, last_modified_date
from "User_Details"
order by id, last_modified_date desc
UNION ALL
select distinct on (user_id) user_id as id, last_modified_date
from "User_Contact_Details"
order by user_id, last_modified_date desc
UNION ALL
select distinct on (user_id) user_id as id, last_modified_date
from "User_Social_Media_Details"
order by user_id, last_modified_date desc
) as usr
where last_modified_date is not null
order by id, last_modified_date desc;
Вам все еще нужен distinct on ()
во внешнем запросе, потому что один и тот же идентификатор пользователя может быть возвращен из разных ветвей UNION.
user
- зарезервированное ключевое слово, избегайте его использования в качестве идентификатора. И если вы это сделаете, вы должны процитировать его "user"
, чтобы избежать путаницы со встроенной функцией user
Если таблица "User_Details"
является «главной» таблицей, на которую ссылаются другие, и вы просто хотите получить самую последнюю дату изменения для каждого идентификатора пользователя, независимо от того, в какой таблице произошла ошибка, вы также можете использовать объединение с группой. по:
select id,
max(greatest(ud.last_modified_date, ucd.last_modified_date, usmd.last_modified_date)) as latest_modification
from "User_Details" ud
left join "User_Contact_Details" ucd on ucd.user_ud = ud.id
left join "User_Social_Media_Details" usmd on usmd.user_id = ud.id
group by id;