Проблема не в PIVOT
, а в подзапросе до PIVOT
, и ваш вопрос может быть уменьшен до:
Как я могу получить запрос (переименовывая ваш идентификаторы, имеющие допустимые значения):
SELECT num,
position
FROM values1 val
FULL OUTER JOIN values2 val2
ON val.id = val2.id
WHERE val.code = 'example'
AND val.num IS NOT NULL
чтобы всегда возвращать хотя бы одну строку?
Если у вас есть тестовые данные:
CREATE TABLE values1 ( id, code, num ) AS
SELECT 1, 'example', NULL FROM DUAL UNION ALL
SELECT 2, 'not_example', 1 FROM DUAL;
CREATE TABLE values2 ( id, position ) AS
SELECT 1, 1 FROM DUAL UNION ALL
SELECT 1, 2 FROM DUAL UNION ALL
SELECT 2, 1 FROM DUAL UNION ALL
SELECT 2, 3 FROM DUAL;
Тогда в вашем предложении WHERE
нет строки, которая соответствовала бы условиям фильтра, и в PIVOT
будет ноль строк, поэтому запрос всегда будет возвращать ноль строк. В этом случае вы можете использовать UNION ALL
, чтобы добавить строку:
SELECT num,
position
FROM values1 val
FULL OUTER JOIN values2 val2
ON val.id = val2.id
WHERE val.code = 'example'
AND val.num IS NOT NULL
UNION ALL
SELECT NULL,
NULL
FROM DUAL
WHERE NOT EXISTS (
SELECT 1
FROM value1
WHERE code = 'example'
AND num IS NOT NULL
)
, которая будет выводить:
NUM | POSITION
---: | -------:
<em>null</em> | <em>null</em>
И затем обернутая вокруг оси:
SELECT *
FROM
(
SELECT num,
position
FROM values1 val
FULL OUTER JOIN values2 val2
ON val.id = val2.id
WHERE val.code = 'example'
AND val.num IS NOT NULL
UNION ALL
SELECT NULL,
NULL
FROM DUAL
WHERE NOT EXISTS (
SELECT 1
FROM values1
WHERE code = 'example'
AND num IS NOT NULL
)
)
PIVOT ( MAX(num) FOR position IN (
1 AS "result1",
2 AS "result2",
3 AS "result3"
));
Выходы:
result1 | result2 | result3
------: | ------: | ------:
<em>null</em> | <em>null</em> | <em>null</em>
дБ <> скрипка здесь