У вас есть два варианта.
select t1.t1id, max(t1.Name) Name, max(t2.date) Date,
(select Value from table2 t22
where t22.date = max(t2.date) and t22.t1id = t2.t1id) Value
from table1 t1 left join table2 t2 on t1.t1id = t2.t1id
where Name like '%Smith%'
group by t2.t1id order by 2
ИЛИ
select mx.t1id, mx.Name, mx.Date, t2.Value
from
(
select t1.t1id, max(t1.Name) Name, max(t2.date) Date
from table1 t1 left join table2 t2 on t1.t1id = t2.t1id
where Name like '%Smith%'
group by t2.t1id
) mx left join table2 t2 on (t2.t1id = mx.t1id and t2.date = mx.date)
order by 2
Оба будут давать один и тот же результат.Первый занимает меньше кода, но у вас могут быть проблемы с производительностью с огромным набором данных.Второй требует немного больше кода, но он также немного более оптимизирован.Примечания к параметру JOIN :
- Если вы перейдете влево (как показано в примере), элементы в Таблице 1 без соответствующих записей в Таблице 2 будут отображаться в результате, но значения в столбцах «Дата и значение» будут равны NULL
- Если вы нажмете INNER JOIN, элементы в таблице 1 без соответствующих записей в таблице 2 не будут отображаться .
РЕДАКТИРОВАТЬ
Я пропустил одно из требований: имя соответствовало определенной строке.Код теперь обновлен.«%» Действует как подстановочный знак, поэтому он будет соответствовать таким именам, как «Уилл Смит» и «Wail Smithers».Если вы хотите точное совпадение, удалите символы подстановки ('%').