我刚刚开始使用(Oracle)SQL,遇到了一个问题.基本上,我想把一个未知大小的表转换成另一个表中的一个字段.实际上涉及到更多的表,但我将try 创建一个更简单的示例.有一个表CUSTOMERS:

ID NAME
5 John Smith
17 Jane Doe

一张桌子DETAILS:

ID DETAIL VALUE
5 Street Elm St.
5 Post_code 12345
5 Number 17
17 Telephone 09999999
17 Fax 088888888888

因此,对于每个客户来说,可能有不同的信息,在不知道DETAILS.DETAIL中所有可能的条目的情况下,我想将它们作为键值对放在一个字段中,如下所示:

ID NAME DETAILS
5 John Smith Street: Elm St. Post_code: 12345 Number: 17
17 Jane Doe Telephone: 09999999 Fax: 088888888888

大致来说,到目前为止我能做的是:

SELECT
    CUSTOMERS.ID
    ,CUSTOMERS.NAME
    ,DETAILS.DETAIL || ': ' || DETAILS.VALUE
FROM
    CUSTOMERS
    JOIN DETAILS ON CUSTOMERS.ID = DETAILS.ID

但这会为已知的有关客户的每个详细信息添加一行.我的目标是仍然 for each 客户保留一行.

推荐答案

您可以通过以下查询来实现这一点.

db<>fiddle链接:https://dbfiddle.uk/k02CrDnU

下面的查询适用于Oracle的现代版本(在18c, 21c, and 23c上测试):

SELECT 
    c.ID, 
    c.NAME,
    LISTAGG(d.DETAIL || ': ' || d.VALUE, ' ') AS DETAILS
FROM 
    CUSTOMERS c
JOIN 
    DETAILS d ON c.ID = d.ID
GROUP BY 
    c.ID, c.NAME;

如果您使用的是旧版本的Oracle(例如11g release 2),则必须添加WITHIN语句.下面的查询是上述查询的修订版本,也适用于旧版本.

SELECT 
    c.ID, 
    c.NAME,
    LISTAGG(d.DETAIL || ': ' || d.VALUE, ' ') WITHIN GROUP (ORDER BY d.DETAIL DESC) AS DETAILS
FROM 
    CUSTOMERS c
JOIN 
    DETAILS d ON c.ID = d.ID
GROUP BY 
    c.ID, c.NAME;

Sql相关问答推荐

Snowflake SQL比较克隆x原始计数

如何并行SELECT和RESET?

基于列对多行求和的查询

使用SQL旋转表的列(Snowflake)

retrofit AWS Athena中的JSON

PostgreSQL中的合并命令是原子的,还是需要一些类似于SQL Server版本的内容?

PostgreSQL基于2个COLS的任意组合 Select 唯一行

snowflake/SQL嵌套的JSON对象和数组

如何从查询中的三个或更多个表中添加另一个相同的列?

按用户和时间列出的SQL Group考勤列表

更改重复值的情况

如何在 golang squirrel lib 中添加 postgreSQL 的distinct on

Grafana SQL 模板变量(值、文本)

仅当 SQL Server 中的表为开时,才在存储过程中使用更改跟踪

Postgresql 需要一个查询,为我提供所有没有具有特定状态值的子元素的父母

为什么 get_json_object() 无法从存储在 Hive SQL 表中的 JSON 中提取值?

我现在如何显示重复的汽车? postgresql

当没有任何行存在时,将一个表中的行插入到另一个表中的更好方法

交叉应用 OPENJSON / PIVOT - 错误的顺序

如何在 Oracle 中获取此变量的值?