SQL联接然后合并结果中的列
所以我有两个db2表。其中一个包含工单信息,如id、请求者名称、用户、描述等。第二个表包含注释,该注释被键入另一个表的id。notes字段是一个255文本字段是的,不要建议更改它,我无法控制它。因此,根据注释的数量,注释字段中可能有多个结果,或者没有结果 我有一个获取结果的查询。问题是我从连接中得到了多个结果,因为有多个条目 因此,我的问题是如何将notes表中的结果合并到每个结果的一个字段中?谢谢 代码: 你试过LISTAGG吗 它将允许您合并所有导致附加记录的讨厌字段。。。像这样的SQL联接然后合并结果中的列,sql,db2,Sql,Db2,所以我有两个db2表。其中一个包含工单信息,如id、请求者名称、用户、描述等。第二个表包含注释,该注释被键入另一个表的id。notes字段是一个255文本字段是的,不要建议更改它,我无法控制它。因此,根据注释的数量,注释字段中可能有多个结果,或者没有结果 我有一个获取结果的查询。问题是我从连接中得到了多个结果,因为有多个条目 因此,我的问题是如何将notes表中的结果合并到每个结果的一个字段中?谢谢 代码: 你试过LISTAGG吗 它将允许您合并所有导致附加记录的讨厌字段。。。像这样的 SELE
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
您使用的是什么版本的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
如果您至少运行的是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函数,那么您可以使用递归查询来解决这个问题。这两种技术将在下面的博客中介绍
LISTAGG似乎不是此SQL的一部分。我收到一个错误,说它不是found,只是注意到您说Listag不适合您,这是在DB2LUW9.7中添加的。但是,我相信XML函数从版本9开始就已经存在了,所以这可能仍然适用于您。我想这取决于您所使用的平台和版本嗯,你有双,所以在我纠正后,我得到它不喜欢AS-in-AS-VARCHAR这个关键字,这是这里没有预料到的。在关键字AS处检测到语法错误。有效令牌的部分列表无效。在令牌“A”处检测到语法错误。标记“A”不是有效的标记。有效令牌的部分列表是有效的,这是否有效?从Htedta.WfaIcpp中选择XMLELEMENT名称“A”,aiaktx;-您使用的是什么版本的DB2?
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;