Вы можете использовать многораздельное внешнее объединение, которое будет более эффективным, чем само-объединение, и CROSS JOIN
:
Oracle Setup :
CREATE TABLE table_name ( City, Value ) AS
SELECT 'Helsinki', 1 FROM DUAL UNION ALL
SELECT 'Helsinki', 2 FROM DUAL UNION ALL
SELECT 'Helsinki', 5 FROM DUAL UNION ALL
SELECT 'Kuopio', 4 FROM DUAL UNION ALL
SELECT 'Kuopio', 5 FROM DUAL UNION ALL
SELECT 'Joensuu', 1 FROM DUAL UNION ALL
SELECT 'Joensuu', 2 FROM DUAL UNION ALL
SELECT 'Joensuu', 3 FROM DUAL
Запрос :
SELECT city,
v.value
FROM ( SELECT LEVEL AS value
FROM DUAL
CONNECT BY LEVEL <= ( SELECT MAX( value ) FROM table_name )
-- or just 5 if you want a static value
) v
LEFT OUTER JOIN table_name t
PARTITION BY ( t.City )
ON ( v.value = t.value )
WHERE t.value IS NULL
Выход :
CITY | VALUE
:------- | ----:
Helsinki | 3
Helsinki | 4
Joensuu | 4
Joensuu | 5
Kuopio | 1
Kuopio | 2
Kuopio | 3
дБ <> скрипка здесь