Если я правильно понимаю ОП, данный идентификатор может появиться в TABLE1 или TABLE1_HISTORY или в обоих.
В вашем наборе результатов вы хотите вернуть каждый отдельный идентификатор и самый старый статус / дату, связанные с этим идентификатором, независимо от того, в какой таблице находится самый старый из них.
Итак, посмотрите в ОБОИХ таблицах и верните все записи, в которых нет записей в или таблице, для идентификатора с меньшим значением date_this_status .
Попробуйте это:
SELECT ID, status, date_this_status FROM table1 ta WHERE
NOT EXISTS(SELECT null FROM table1 tb WHERE
tb.id = ta.id
AND tb.date_this_status < ta.date_this_status)
AND NOT EXISTS(SELECT null FROM table1_history tbh WHERE
tbh.id = ta.id
AND tbh.date_this_status < ta.date_this_status)
UNION ALL
SELECT ID, status, date_this_status FROM table1_history tah WHERE
NOT EXISTS(SELECT null FROM table1 tb WHERE
tb.id = tah.id
AND tb.date_this_status < tah.date_this_status)
AND NOT EXISTS(SELECT null FROM table1_history tbh WHERE
tbh.id = tah.id
AND tbh.date_this_status < tah.date_this_status)
Здесь три основных допущения:
- У каждого идентификатора, который вы хотите вернуть, будет хотя бы одна запись хотя бы в одной из таблиц.
- В одной таблице не будет несколько записей с одним и тем же идентификатором с одним и тем же значением date_this_status (можно уменьшить с помощью DISTINCT)
- Не будет записей для того же идентификатора в таблице other с тем же значением date_this_status (может быть уменьшено с помощью UNION вместо UNION ALL)
Мы можем сделать две небольшие оптимизации:
- Если идентификатор имеет запись в TABLE1_HISTORY, он всегда будет старше записи в TABLE1 для этого идентификатора.
- TABLE1 никогда не будет содержать несколько записей для одного и того же идентификатора (но таблица истории может).
Итак:
SELECT ID, status, date_this_status FROM table1 ta WHERE
NOT EXISTS(SELECT null FROM table1_history tbh WHERE
tbh.id = ta.id
)
UNION ALL
SELECT ID, status, date_this_status FROM table1_history tah WHERE
NOT EXISTS(SELECT null FROM table1_history tbh WHERE
tbh.id = tah.id
AND tbh.date_this_status < tah.date_this_status)