2012-08-03 97 views
0

所以我有两个db2表。一个包含工作订单信息,如ID,请求者名称,用户,描述等。第二个表具有注释,该注释与另一个表的ID相关。笔记字段是一个255文本字段(是的,不建议改变它,我无法控制它)。所以在注释字段中可能会有多个结果,或者没有结果,这取决于显然有多少个音符。SQL加入然后结合结果列

我有一个查询获取结果。问题是我从联接获取多个结果,因为有多个条目。

所以我的问题是如何concat /合并从每个结果的笔记表结果到一个字段?由于

代码:

SELECT 
    p.ABAANB AS WO_NUMBER, 
    p.ABAJTX AS Description, 
    i.AIAKTX as Notes 
FROM 
    htedta.WFABCPP p LEFT JOIN HTEDTA.WFAICPP i 
    ON i.AIAANB = p.ABAANB 
WHERE 
    p.ABABCD = 'ISST' AND p.ABAFD8 = 0 
+0

这是于IBM iSeries – T3chn0crat 2012-08-03 22:39:51

回答

0

你试过LISTAGG

https://www.ibm.com/developerworks/mydeveloperworks/blogs/SQLTips4DB2LUW/entry/listagg?lang=en

它可以让你合并所导致的其他记录所有那些讨厌的领域......像这样的事情。 ..

SELECT p.ABAANB AS WO_NUMBER, p.ABAJTX AS Description, LISTAGG(i.AIAKTX, ' ') as Notes 
FROM htedta.WFABCPP p 
LEFT JOIN HTEDTA.WFAICPP i 
    ON i.AIAANB = p.ABAANB 
WHERE p.ABABCD = 'ISST' 
    AND p.ABAFD8 = 0 
GROUP BY p.ABAAMB, p.ABAJTX 
+0

描述看来,LISTAGG不是此SQL的一部分。我收到一个错误,说没有找到它 – T3chn0crat 2012-08-03 16:55:41

0

什么版本的DB2是你继续?如果您使用DB2的Linux/Unix/Windows的(LUW),那么这应该为你工作:

SELECT p.ABAANB AS WO_NUMBER, 
     p.ABAJTX AS Description, 
     ,SUBSTR(
      xmlserialize(
      xmlagg(
       xmltext(
        concat(',' , TRIM(i.AIAKTX)) 
       ) 
      ) AS VARCHAR(4000) 
     ) 
      ,2) AS NOTES 
FROM  htedta.WFABCPP p 
LEFT JOIN HTEDTA.WFAICPP i 
     ON i.AIAANB = p.ABAANB 
WHERE p.ABABCD = 'ISST' 
    AND p.ABAFD8 = 0 
GROUP BY p.ABAANB, 
     p.ABAJTX 
+0

只是注意到你说'LISTAGG()'不适合你,并且已经添加到DB2 LUW 9.7中。不过,我相信自从第9版起,XML函数就已经出现了,所以这可能对您仍然有用。我想这取决于你所在的平台和版本。 :) – bhamby 2012-08-03 19:25:30

+0

嗯,你已经加倍了,所以在我纠正之后,我发现它不像AS VARCHAR中的AS('关键字AS在这里没有预料到,在关键字AS处检测到语法错误。有效令牌列表是)' – T3chn0crat 2012-08-03 22:28:19

0

如果您正在运行DB2至少9.7,你应该能够使用类似XMLAGG函数

WITH CombinedNotes(aiaanb, aiaktx) AS (
     SELECT aiaanb 
     , REPLACE(REPLACE( 
       CAST(XML2CLOB(
        XMLAGG(XMLELEMENT( 
         NAME 'A' 
         , aiaktx 
       )) 
      ) AS VARCHAR(3000)) 
      , '<A>',''), '</A>', '') 
     FROM Htedta.WfaIcpp) 
    SELECT p.ABAANB AS WO_NUMBER, p.ABAJTX AS Description, i.AIAKTX as Notes 
     FROM htedta.WFABCPP p 
     LEFT JOIN CombinedNotes i 
     ON i.AIAANB = p.ABAANB 
     WHERE p.ababcd = 'ISST' 
     AND p.abafd8 = 0; 

如果您有DB2,或登录由于某种原因,不允许XML功能的早期版本,你可以用一个递归查询解决问题。这两种技术在以下博客

http://ibmmainframes.com/about44805.html

+0

'在标记'A'处检测到语法错误。令牌“A”不是有效的令牌。有效令牌的部分列表是)' – T3chn0crat 2012-08-03 22:29:53

+0

这是否工作? SELECT XMLELEMENT(NAME'A',aiaktx)FROM Htedta.WfaIcpp; - 您使用的是哪个版本的DB2? – user980717 2012-08-04 04:38:05