@SergeySafaryanc

Схлопывание версий в 2х таблицах?

Есть таблица 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

Заранее спасибо за ответ)
  • Вопрос задан
  • 258 просмотров
Решения вопроса 1
@res2001
Developer, ex-admin
Условием связывания вы вообще обнуляете смысл cross join.
Собственно из-за этого условия отсеиваются записи, которых нет в ft.
Предусмотрите в условии, что ft.id или st.id могут быть NULL, т.е. текущее условие должно выполняться только когда ft.id и st.id не NULL.
Я бы сделал основной запрос с left join и к нему через union присоединил из st, то что не попало из st в первом запросе.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы