[英]How can I easily convert an outer joined SQL table to a json object?
我正在使用 nodejs 和 oracledb,我能够将一个简单的查询转换为一个 json 文件。
我想做的是将我的 oracle 查询的结果转换为 json 对象。 问题变成了我的加入
例如,假设我有一个用户表,其中包含名称和 ID。 我还有一个网络登录表,每个都包含一个用户 ID。 我想做的是为每个用户创建一个 json,其中包含他们的姓名、ID 和他们的网络登录列表。
通过外连接,我得到了所有相关数据,但是每个 id/name 都是重复的,所以我得到了每个用户的几个 json 条目。
我没有你的表也没有数据,所以 - 这是一个基于 Scott 的示例模式及其部门和员工表的示例:
SQL> select d.dname, d.loc, e.ename, e.job, e.sal
2 from dept d join emp e on e.deptno = d.deptno
3 order by d.dname;
DNAME LOC ENAME JOB SAL
-------------- ------------- ---------- --------- ----------
ACCOUNTING NEW YORK MILLER CLERK 1300.1
ACCOUNTING NEW YORK KING PRESIDENT 5000
ACCOUNTING NEW YORK CLARK MANAGER 2450
RESEARCH DALLAS ADAMS CLERK 1100.1
RESEARCH DALLAS FORD ANALYST 3000
RESEARCH DALLAS JONES MANAGER 2975
RESEARCH DALLAS SMITH CLERK 800.1
RESEARCH DALLAS SCOTT ANALYST 3000
SALES CHICAGO WARD SALESMAN 1250.1
SALES CHICAGO TURNER SALESMAN 1500.1
SALES CHICAGO ALLEN SALESMAN 1600.1
SALES CHICAGO JAMES CLERK 950.1
SALES CHICAGO BLAKE MANAGER 2850
SALES CHICAGO MARTIN SALESMAN 1250.1
14 rows selected.
SQL>
如果我理解正确,您希望将部门作为“主”数据,将在该部门工作的员工作为其“详细信息”。 如果是这样,请使用json_arrayagg
:
SQL> select
2 json_object ('OBJ' value json_object
3 ('DEPARTMENT' value json_object
4 ('NAME' value d.dname,
5 'LOCATION' value d.loc
6 )
7 ),
8 'EMPS' value json_arrayagg
9 (json_object ('NAME' value e.ename,
10 'JOB' value e.job,
11 'SALARY' value e.sal
12 )
13 )
14 ) obj
15 from dept d join emp e on e.deptno = d.deptno
16 group by d.dname, d.loc;
结果:
OBJ
--------------------------------------------------------------------------------
{"OBJ":{"DEPARTMENT":{"NAME":"SALES","LOCATION":"CHICAGO"}},"EMPS":[{"NAME":"WAR
D","JOB":"SALESMAN","SALARY":1250.1},{"NAME":"MARTIN","JOB":"SALESMAN","SALARY":
1250.1},{"NAME":"BLAKE","JOB":"MANAGER","SALARY":2850},{"NAME":"JAMES","JOB":"CL
ERK","SALARY":950.1},{"NAME":"ALLEN","JOB":"SALESMAN","SALARY":1600.1},{"NAME":"
TURNER","JOB":"SALESMAN","SALARY":1500.1}]}
{"OBJ":{"DEPARTMENT":{"NAME":"RESEARCH","LOCATION":"DALLAS"}},"EMPS":[{"NAME":"J
ONES","JOB":"MANAGER","SALARY":2975},{"NAME":"SCOTT","JOB":"ANALYST","SALARY":30
00},{"NAME":"SMITH","JOB":"CLERK","SALARY":800.1},{"NAME":"ADAMS","JOB":"CLERK",
"SALARY":1100.1},{"NAME":"FORD","JOB":"ANALYST","SALARY":3000}]}
{"OBJ":{"DEPARTMENT":{"NAME":"ACCOUNTING","LOCATION":"NEW YORK"}},"EMPS":[{"NAME
":"CLARK","JOB":"MANAGER","SALARY":2450},{"NAME":"MILLER","JOB":"CLERK","SALARY"
:1300.1},{"NAME":"KING","JOB":"PRESIDENT","SALARY":5000}]}
SQL>
如果您将其中任何一个复制/粘贴到例如JSON 格式化程序和验证程序中以检查它的真实外观以及它是否有效,您会得到
{
"OBJ":{
"DEPARTMENT":{
"NAME":"SALES",
"LOCATION":"CHICAGO"
}
},
"EMPS":[
{
"NAME":"WARD",
"JOB":"SALESMAN",
"SALARY":1250.1
},
{
"NAME":"MARTIN",
"JOB":"SALESMAN",
"SALARY":1250.1
},
{
"NAME":"BLAKE",
"JOB":"MANAGER",
"SALARY":2850
},
{
"NAME":"JAMES",
"JOB":"CLERK",
"SALARY":950.1
},
{
"NAME":"ALLEN",
"JOB":"SALESMAN",
"SALARY":1600.1
},
{
"NAME":"TURNER",
"JOB":"SALESMAN",
"SALARY":1500.1
}
]
}
这是一个有效的 JSON。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.