2012-08-03 96 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