Вы можете использовать курсоры уровня поля:
WITH items AS
(
SELECT 1 AS item_id
FROM dual
UNION ALL
SELECT 2 AS item_id
FROM dual
),
messages AS
(
SELECT 1 AS item_id, 100 AS message_code
FROM dual
UNION ALL
SELECT 1 AS item_id, 105 AS message_code
FROM dual
UNION ALL
SELECT 1 AS item_id, 201 AS message_code
FROM dual
UNION ALL
SELECT 2 AS item_id, 100 AS message_code
FROM dual
UNION ALL
SELECT 2 AS item_id, 15 AS message_code
FROM dual
)
SELECT item_id,
CURSOR
(
SELECT message_code
FROM messages m
WHERE m.item_id = i.item_id
)
FROM items i
или создать тип таблицы и привести MULTISET
значений к этому типу:
CREATE TYPE t_message_code AS TABLE OF INTEGER
WITH items AS
(
SELECT 1 AS item_id
FROM dual
UNION ALL
SELECT 2 AS item_id
FROM dual
),
messages AS
(
SELECT 1 AS item_id, 100 AS message_code
FROM dual
UNION ALL
SELECT 1 AS item_id, 105 AS message_code
FROM dual
UNION ALL
SELECT 1 AS item_id, 201 AS message_code
FROM dual
UNION ALL
SELECT 2 AS item_id, 100 AS message_code
FROM dual
UNION ALL
SELECT 2 AS item_id, 15 AS message_code
FROM dual
)
SELECT item_id,
CAST
(
MULTISET
(
SELECT message_code
FROM messages m
WHERE m.item_id = i.item_id
) AS t_message_code
)
FROM items i