sql - UPDATE SQL 查询中的聚合

标签 sql oracle join aggregation

因此,我当前有两个表,一个包含每个对象的固定部分,另一个包含每个对象的可变数量的属性作为键/值对。我想将这些属性转换为 JSON 映射格式的主表中的 CLOB 字段。

create table test_a (id integer, properties clob);
create table test_b (id integer, a_id integer, key char(30), value char(30));

insert into test_a values(1,'');
insert into test_a values(2,'');
insert into test_a values(3,'');

insert into test_b values (1, 1, 'k1', 'v1');
insert into test_b values (2, 1, 'k2', 'v2');
insert into test_b values (3, 2, 'k3', 'v3');
insert into test_b values (4, 2, 'k4', 'v4');
insert into test_b values (5, 2, 'k5', 'v5');
insert into test_b values (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"

有什么想法吗?

最佳答案

您需要一个相关子查询而不是group by。整个外部查询看起来不正确,所以我认为你需要类似的东西:

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
       ) ;

关于sql - UPDATE SQL 查询中的聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34857916/

相关文章:

sql - 为什么 CHARINDEX 函数返回字符串 'Œ' 中 'manoeuvre' 的索引?

java - Oracle Java ConcurrentHashMap 的错误实现?

ruby-on-rails - Rails Postgresql 如何从一张表中获取 JOIN?

mysql - 尝试引用同一个表中的两个主键时如何修复外键约束?

sql - 如何获取表中子集的max(id)

oracle 数据库 AUDIT 不显示 SQL 文本和绑定(bind)值

database - 为什么在 DDL 命令之前和之后执行的 DML 命令会自动提交?

mysql - 如何在 UPDATE 查询中执行三个表 JOIN?

php - 从两个同名表中选择数据

mysql - 根据另一个表上的映射值更新 a 上的 MySQL