Inf*_*igo 3 sql oracle oracle11g
使用Oracle 11g
假设我们有两个表:
CREATE TABLE items (
item_id NUMBER(22,0)
);
CREATE TABLE messages (
item_id NUMBER(22,0),
message_code NUMBER(22,0)
);
Run Code Online (Sandbox Code Playgroud)
哪里有一个(项目)到多个(消息)的关系.我想在单个查询中选择所有内容以将其转换为java.有可能写这样的查询,它会给我输出像:
ID MESSAGE
----------------------------------
1 (100, 105, 201)
2 (100, 105)
Run Code Online (Sandbox Code Playgroud)
MESSAGE列是一个数组或类似的东西(不是连接字符串)?
您可以使用字段级游标:
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
Run Code Online (Sandbox Code Playgroud)
或者创建一个表类型并将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
Run Code Online (Sandbox Code Playgroud)