【问题标题】:Oracle database concat columnOracle 数据库连接列
【发布时间】:2017-12-18 10:37:41
【问题描述】:

Oracle Database 12c 企业版 12.1.0.2.0 有人可以帮助我查询 Oracle

    **TABLE A**         **TABLE B**           **TABLE usuarios**

  RU                  RU       DESCRIP      iduser
==================  ====================  =======================
| adm            |  | adm   | hi       |  |  1                  |
| adm            |  | adm   | help     |  |  1                  |
| adm            |  | adm   | me       |  |  1                  |
| usr            |  | urs   | good day |  |  1                  |
| rhm            |  | rhm   | s        |  |  1                  |

table usuario 是参考 >> Table ATable A 参考 >> Table B

这是我的查询和 结果是

adm = 嗨,嗨,嗨

SELECT case row_number()
over (partition by A.ru by B.descrip) WHEN 1
THEN A.RU
END as RU,
LISTAGG(B.descrip, ', ') 
WITHIN GROUP (ORDER BY A.RU) "names"
FROM A
INNER JOIN usuarios on usuarios.iduser = A.iduser 
LEFT JOIN B ON B.RU = A.RU
WHERE A.iduser = 1 
GROUP BY A.RU, B.descrip 
ORDER BY A.RU, B.descrip

我需要这个结果

RESULT 

adm = hi help me
usr = good day
rhm = s

【问题讨论】:

  • 恐怕您的表 B 缺少一些关于每个描述词应采用的 顺序 的重要信息。
  • 除了 Tim 的问题(你如何确定以什么顺序连接值?)之外,至少还有两个重要的问题。 (1) 你有什么版本的Oracle?不同的工具有不同的版本。不要猜测;运行select * from v$version 并报告完整(五部分)版本,如 12.1.0.2.0。 (2) 连接的结果会不会很长(超过 4000 字节)?您需要哪些工具在很大程度上取决于此。
  • 在您现有的代码中,首先突出(并导致意外结果)的是您按ru descrip 分组。您不应按descrip 分组。

标签: database oracle concat


【解决方案1】:

这是我的新查询

SELECT  A.RU,
LISTAGG(B.descrip, ',') WITHIN GROUP (ORDER BY B.descrip)
over (partition by A.RU) B
FROM A 
inner join usuarios on usuarios.iduser = A.RU
left join  B on B.RU = A.RU
where      A.iduser = 1
GROUP BY A.RU, B.descrip
order by A.RU, B.descrip;


table result
=================
 RU      descrip      
=================
adm    hi help me
adm    hi help me
adm    hi help me
usr    good day
rhm    s

我只需要

adm  hi help me
usr  good day
rhm  s

【讨论】:

    【解决方案2】:

    正确查询:

    select distinc * from (
        SELECT  A.RU,
        LISTAGG(B.descrip, ',') WITHIN GROUP (ORDER BY B.descrip)
        over (partition by A.RU) B
        FROM A 
        inner join usuarios on usuarios.iduser = A.RU
        left join  B on B.RU = A.RU
        where      A.iduser = 1
        GROUP BY A.RU, B.descrip
        order by A.RU, B.descrip
    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-03
      • 2014-03-18
      • 2019-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多