Я работаю с DB2 Blu, и у меня часто возникают проблемы в плане запросов с SUBSTR, поскольку оператор CTQ недостаточно высок.
Вот пример:
select
coalesce(annee,annee_semaine),
count(JOUR_OUVRE)
from d_tps_calendrier
group by grouping sets((annee),(annee_semaine))
С планом запроса все в порядке:
Rows
RETURN
( 1)
Cost
I/O
|
2701
L TQ
( 2)
334.257
224
|
2701
C TQ
( 3)
333.573
224
|
2701
UNION
( 4)
332.721
224
/-+--\
2649 52
GRPBY GRPBY
( 5) ( 10)
166.197 166.107
112 112
| |
22310 22310
TBSCAN TBSCAN
( 6) ( 11)
165.176 165.176
112 112
| |
22310 22310
TEMP TEMP
( 7) ( 7)
147.121 147.121
112 112
|
22310
GRPBY
( 8)
134.404
112
|
22310
TBSCAN
( 9)
132.702
112
|
22310
CO-TABLE: INFIFZ00
D_TPS_CALENDRIER_INF
Q1
Теперь, что я действительно хочу сделать, это группа по первым 3 символам annee_semaine:
select
coalesce(annee,substr(annee_semaine,1,3)),
count(JOUR_OUVRE)
from d_tps_calendrier
group by grouping sets((annee),(substr(annee_semaine,1,3)))
А теперь в запросе plan, group by и union выполняются после оператора CTQ
Rows
RETURN
( 1)
Cost
I/O
|
2701
UNION
( 2)
431.235
224
/-+--\
2649 52
GRPBY GRPBY
( 3) ( 14)
220.453 210.366
112 112
| |
2649 22310
TBSCAN TBSCAN
( 4) ( 15)
220.219 208.372
112 112
| |
2649 22310
SORT TEMP
( 5) ( 7)
220.219 190.317
112 112
|
22310
TBSCAN
( 6)
208.372
112
|
22310
TEMP
( 7)
190.317
112
|
22310
LM TQ
( 8)
181.039
112
|
22310
GRPBY
( 9)
165.712
112
|
22310
TBSCAN
( 10)
163.749
112
|
22310
SORT
( 11)
161.817
112
|
22310
C TQ
( 12)
132.866
112
|
22310
TBSCAN
( 13)
132.702
112
|
22310
CO-TABLE: INFIFZ00
D_TPS_CALENDRIER_INF
Q1
Я пытался использовать left вместо substr, но безуспешно. Есть ли хорошая практика для работы с substr в DB2 Blu?
В других случаях мне удалось напрямую поместить de substr в один столбец таблицы, но в этом случае это невозможно.