在SQL中联合时,如何连接相同ID的字符串字段?

在SQL中联合时,如何连接相同ID的字符串字段?,sql,oracle,union,concat,Sql,Oracle,Union,Concat,我有以下选择: (SELECT DISTINCT V1.FORPDM_ID AS HVID, 1 AS IMPORT_STATUS, V1.CREATEDAT AS IMPORT_DATE, 'ok' AS IMPORT_MESSAGE, V1.ID AS AT_ID, V1.FORPDM_TRANSACTION_ID AS TRANSACTION_ID FROM V_VALIDATIONCARRIER V1, V_FORPDM_DAVE_HWDEMAND

我有以下选择:

(SELECT DISTINCT
   V1.FORPDM_ID AS HVID,
   1 AS IMPORT_STATUS,
   V1.CREATEDAT AS IMPORT_DATE,
   'ok' AS IMPORT_MESSAGE,
   V1.ID AS AT_ID,
   V1.FORPDM_TRANSACTION_ID AS TRANSACTION_ID
 FROM V_VALIDATIONCARRIER V1, V_FORPDM_DAVE_HWDEMAND V2
 WHERE
   V1.FORPDM_ID = V2.HVID AND -- JOIN CONDITION
   ...other conditions...
)

UNION ALL

(SELECT DISTINCT
   V1.FORPDM_ID AS HVID,
   0 AS IMPORT_STATUS,
   V1.CREATEDAT AS IMPORT_DATE,
   'PC_ID is null or not in V_PLANNINGCATEGORY' AS IMPORT_MESSAGE,
   V1.ID AS AT_ID,
   V1.FORPDM_TRANSACTION_ID AS TRANSACTION_ID
 FROM V_VALIDATIONCARRIER V1, V_FORPDM_DAVE_HWDEMAND V2
 WHERE (V1.FORPDM_ID = V2.HVID) AND -- JOIN CONDITION
     ...some error conditions...
)

UNION ALL

(SELECT DISTINCT
   V1.FORPDM_ID AS HVID,
   0 AS IMPORT_STATUS,
   V1.CREATEDAT AS IMPORT_DATE,
   'BAUPHASE is null or not in V_SPEEDSPECIFICMASTERDATA' AS IMPORT_MESSAGE,
   V1.ID AS AT_ID,
   V1.FORPDM_TRANSACTION_ID AS TRANSACTION_ID
 FROM V_VALIDATIONCARRIER V1, V_FORPDM_DAVE_HWDEMAND V2
 WHERE (V1.FORPDM_ID = V2.HVID) AND -- JOIN CONDITION
       ...some other error conditions...
)
在我的数据库中,有一些行可以匹配这两个错误条件,我希望在发生这种情况时连接两个IMPORT_消息,这样我就不会得到两个具有相同HVID和两个不同IMPORT_消息的行。 当我在查询中同时使用UNION时,在Oracle中有没有实现这一点的方法

编辑 经过一些测试,它成功了。只有一个澄清:要获得我的所有数据和消息,我应该选择如下所示:

SELECT DISTINCT HVID, IMPORT_STATUS, IMPORT_DATE, TRANSACTION_ID, AT_ID, LISTAGG(IMPORT_MESSAGE, ',') 
   WITHIN GROUP (ORDER BY IMPORT_MESSAGE) AS 
      IMPORT_MESSAGE FROM ( ...my union all select... ) MYUNION 
   GROUP BY HVID, IMPORT_STATUS, IMPORT_DATE, TRANSACTION_ID, AT_ID; 

我认为您必须在Oracle环境中使用Listag函数

例如,请参见:

我没有Oracle数据库,所以您必须尝试

SELECT LISTAGG(IMPORT_MESSAGE, ',') WITHIN GROUP (ORDER BY NULL)
FROM (
    .... your union all select
     ) as YOURUNION
GROUP BY YOURUNION.IMPORT_MESSAGE;