更新SQL查询中的聚合
因此,我目前有两个表,一个包含每个对象的固定部分,另一个包含作为键/值对的每个对象的可变数量的属性。我想将这些属性转换为JSON映射格式的主表中的CLOB字段更新SQL查询中的聚合,sql,oracle,join,aggregation,Sql,Oracle,Join,Aggregation,因此,我目前有两个表,一个包含每个对象的固定部分,另一个包含作为键/值对的每个对象的可变数量的属性。我想将这些属性转换为JSON映射格式的主表中的CLOB字段 创建表test_a(id整数,properties clob); 创建表test_b(id integer,a_id integer,key char(30),value char(30)); 插入测试_a值(1,”); 插入测试_a值(2''); 插入测试_a值(3,”); 插入测试_b值(1,1,'k1,'v1'); 插入测试_b值(
创建表test_a(id整数,properties clob);
创建表test_b(id integer,a_id integer,key char(30),value char(30));
插入测试_a值(1,”);
插入测试_a值(2'');
插入测试_a值(3,”);
插入测试_b值(1,1,'k1,'v1');
插入测试_b值(2,1,'k2',v2');
插入测试_b值(3,2,'k3,'v3');
插入测试_b值(4,2,'k4',v4');
插入测试_b值(5,2,k5,v5');
插入测试_b值(6,2,'k6',v6');
我可以通过以下查询构建我想要的JSON:
WITH PROPS AS
(SELECT '"'
||trim(KEY)
||'":"'
||trim(value)
||'"' json,
test_b.*
FROM test_b
)
SELECT test_a.id,
'{'
||
(SELECT listagg(json, ',') within GROUP (
ORDER BY props.key)
FROM PROPS
WHERE PROPS.A_ID = test_a.id
)
|| '}'
FROM TEST_A
INNER JOIN PROPS
ON TEST_A.ID = PROPS.A_ID
GROUP BY TEST_A.ID ;
我得到了想要的结果
1 "{""k1"":""v1"",""k2"":""v2""}"
2 "{""k3"":""v3"",""k4"":""v4"",""k5"":""v5"",""k6"":""v6""}"
但是,当我尝试使用此结果插入主表时,会出现错误
UPDATE TEST_A SET PROPERTIES = (
WITH PROPS AS
(SELECT '"'
||trim(key)
||'":"'
||trim(value)
||'"' json,
test_b.*
FROM test_b
)
SELECT '{'
||
(SELECT listagg(json, ',') within GROUP (order by props.key) FROM PROPS
WHERE PROPS.A_ID = test_a.id)
|| '}' from TEST_A INNER JOIN PROPS ON TEST_A.ID = PROPS.A_ID GROUP BY TEST_A.ID
) ;
Error report -
SQL Error: ORA-01427: single-row subquery returns more than one row
01427. 00000 - "single-row subquery returns more than one row"
有什么想法吗?你需要一个相关的子查询,而不是一个
分组依据。整个外部查询看起来不正确,因此我认为您需要如下内容:
UPDATE TEST_A
SET PROPERTIES = (
WITH PROPS AS (
SELECT '"'||trim(key)||'":"'||trim(value)||'"' as json,
test_b.*
FROM test_b
)
SELECT '{' || listagg(json, ',') within GROUP (order by props.key) || '}'
FROM PROPS
WHERE PROPS.A_ID = test_a.id
) ;