Одним из способов решения вашей проблемы является не «дублирование строк», а «заполнение разреженных данных».
У вас есть список известных размеров автомобилей: 6010, 6015, 6020 и6025. У вас есть наборы данных, заданные market_to
и market_from
, где каждый набор может содержать не все известные размеры автомобиля.Вы хотите заполнить разреженные данные таким образом, чтобы каждый набор содержал каждый известный размер транспортного средства.
Хорошим инструментом SQL в Oracle для заполнения разреженных данных является «секционированное» внешнее соединение.Вот как это будет работать для вашего запроса:
Настройка
CREATE TABLE market_data (
market_to varchar2(6),
market_from varchar2(6),
vehicle_size number(4),
l number,
h number);
INSERT INTO market_data
SELECT 'FCS010','FCS416',6025, 0.1, 0.3 FROM DUAL UNION ALL
SELECT 'FCS010','FCS416',6020, 0.1, 0.3 FROM DUAL UNION ALL
SELECT 'FCS012','FCS416',6010, 0.1, 0.3 FROM DUAL UNION ALL
SELECT 'FCS012','FCS416',6015, 0.1, 0.3 FROM DUAL ;
COMMIT;
Разделенный запрос внешнего соединения
(примечание: если у вас есть таблица с известными размерами автомобиля, выможете использовать это и опустить предложение WITH
.)
with vehicle_sizes ( vehicle_size ) AS
( SELECT column_value FROM TABLE(sys.odcinumberlist(6010, 6015, 6020, 6025)) )
select md.market_from,
md.market_to,
vs.vehicle_size,
nvl(md.l, min(md.l) over ( partition by md.market_from, md.market_to )) l,
nvl(md.h, min(md.h) over ( partition by md.market_from, md.market_to )) h
from market_data md partition by (md.market_to, md.market_from)
right outer join vehicle_sizes vs on vs.vehicle_size = md.vehicle_size;
+-------------+-----------+--------------+-----+-----+
| MARKET_FROM | MARKET_TO | VEHICLE_SIZE | L | H |
+-------------+-----------+--------------+-----+-----+
| FCS416 | FCS010 | 6010 | 0.1 | 0.3 |
| FCS416 | FCS010 | 6015 | 0.1 | 0.3 |
| FCS416 | FCS010 | 6020 | 0.1 | 0.3 |
| FCS416 | FCS010 | 6025 | 0.1 | 0.3 |
| FCS416 | FCS012 | 6010 | 0.1 | 0.3 |
| FCS416 | FCS012 | 6015 | 0.1 | 0.3 |
| FCS416 | FCS012 | 6020 | 0.1 | 0.3 |
| FCS416 | FCS012 | 6025 | 0.1 | 0.3 |
+-------------+-----------+--------------+-----+-----+