Не уверен насчет MySQL, но если вы делаете это с Oracle, я бы использовал аналитическую функцию LEAD
, чтобы получить следующее значение даты в будущем в tableX, а затем присоединить его к tableY.
Примером этого может быть:
select
tabX_id,
date_val as min_date,
next_date_val as max_date,
valueZ,
valueX,
valueY,
y.date_val as tabY_date
from (
select
tabX_id,
date_val,
lead(date_val) over (partition by tabx_id order by date_val)
as next_date_val,
valueZ
from tabX
) x
join tabY y on (x.tabX_id = y.tabX_id and
y.date_val >= x.date_val and
(x._next_date_val is null or y.date_val < x.next_date_val))
Обратите внимание, что я не изменил следующее значение даты, поэтому использую условие меньше чем. Это, вероятно, уместно, если у вас есть компонент времени в любом из полей даты, но он может быть не совсем тем, что вы хотите, если они являются просто значением даты.