Есть таблица ft:
| id | param1 | param2 | dfrom | dto |
|----|--------|--------|-----------------------|-----------------------|
| 1 | 'SS' | 'DD' | '01.04.2010 12:30:20' | '17.04.2010 13:10:14' |
| 1 | 'ZZ' | null | '17.04.2010 13:10:15' | '18.01.2010 04:13:15' |
| 1 | 'ZZ' | 'GG' | '18.01.2010 04:13:16' | '12.12.2010 00:00:00' |
Вторая таблица st:
| id | param3 | dfrom | dto |
|----|--------|-----------------------|-----------------------|
| 1 | 'KK' | '01.03.2010 12:30:20' | '02.04.2010 13:10:14' |
| 1 | 'QQ' | '02.04.2010 13:10:15' | '12.12.2010 00:00:00' |
В результате должно получится:
| id | param1 | param2 | param3 | dfrom | dto |
| 1 | 'ZZ' | 'DD' | 'QQ' | '18.01.2010 04:13:16' | '12.12.2010 00:00:00' |
| 1 | null | null | 'KK' | '01.03.2010 12:30:20' | '01.04.2010 12:30:19' |
| 1 | 'SS' | 'DD' | 'KK' | '01.04.2010 12:30:20' | '02.04.2010 13:10:14' |
| 1 | 'SS' | 'DD' | 'QQ' | '02.04.2010 13:10:15' | '17.04.2010 13:10:14' |
| 1 | 'ZZ' | null | 'QQ' | '17.04.2010 13:10:15' | '18.01.2010 04:13:15' |
У меня проблема, я не могу получить вторую запись (1, null, null, 'KK' ...). Он не выводит промежуток времени в котором запись не пересекалась с по времени с другими записями в другой таблице.
Мой запрос:
select
a.id, param1, param2, param3,
case when b.dfrom < a.dfrom then b.dfrom else a.dfrom end as dfrom,
case when b.dto < a.dto then b.dto else a.dto end as dto
from
ft a cross join st b
where
a.id = b.id and (a.dfrom between b.dfrom and b.dto or a.dto between b.dfrom and b.dto)
Или надо union использовать?
select id, param1, param2, null as param3, dfrom, dto from ft
union all
select id, null as param1, null as param2, param3, dfrom, dto from st
Заранее спасибо за ответ)