【问题标题】:Complex SQL Query for retrieving specific rows from a table用于从表中检索特定行的复杂 SQL 查询
【发布时间】:2011-11-21 14:57:19
【问题描述】:

我有 2 个表 emp 和 emp_desc

emp 表有列 empid,empname,eempaddress

emp_desc 表有 empidempdescseqnoempdesc 列(对于一个 empid,我们有多个 empdesc - 它不是固定的)

表 1

empid  ename   eaddress
 1      ABS      PPPPPP
 2      DSC      CCCCC

表 2

empid  empdescseqno  empdesc
  1      1              JJJJJ
  1      2              KKKKKK
  1      3              LLLLLL
  2      1              MMMMMM
  2      2              NNNNNN

我想检索连接两个表的 empid、empname 和 empdesc。但是,在结果表中,应将与一名员工对应的所有 empdesc 连接到一个字符串中。

也就是说,结果应该是这样的:

empid    empname    empdesc
  1       ABS        JJJJJ KKKKKK LLLLLL
  2       DSC        MMMMMM NNNNNN

我需要编写一个通用的 SELECT 查询来生成上面的最终表。

【问题讨论】:

  • 你使用什么数据库?没有可移植的解决方案,SQL 纯粹主义者(我不是其中之一)会告诉你无论如何都不应该在 SQL 中这样做。
  • 我正在使用 DB2 数据库。实际上这是 Spring Batch Item Reader 的输入。这要求仅通过选择查询将项目作为单行(将进入 POJO)。
  • 如果您使用Oracle或SqlServer或DB2,您可以尝试使用ListAgg()函数。 publib.boulder.ibm.com/infocenter/db2luw/v9r7/…
  • 这里看起来是同一个问题:stackoverflow.com/questions/3728010/…
  • 我需要可以在 DB2 上运行的查询

标签: sql database select db2


【解决方案1】:

如果您使用的是 MYSQL 数据库,那么您可以使用此查询。

SELECT empid, ename, GROUP_CONCAT(empdesc ORDER BY empdescseqno SEPARATOR ' ') as empdesc FROM employee emp 
INNER JOIN employee_map emp_map ON emp.empid = emp_map.empid 
GROUP BY emp.empid;

这将给出你想要的结果。

我认为您希望它用于 DB2,那么您需要在 DB2 中找到替代功能

【讨论】:

    【解决方案2】:

    在此处复制 Mayank 的答案,因为他将其保存在 cmets 中

    select e.empid, substr( xmlserialize( xmlagg( xmltext( concat( ', ', empdesc ) ) ) as varchar( 1024 ) ), 3 ) from empdesc desc , emp e where e.empid =desc.empid group by e.empid
    

    感谢 Dan 指出旧链接。

    【讨论】:

    • 这可能不适用于所有版本的 DB2 - 具体来说,一些 iSeries 版本缺少此功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-26
    相关资源
    最近更新 更多