SQL 中的 UNION 时如何连接相同 ID 的字符串字段?
How to concatenate strings fields for same ID when UNION in SQL?
我有以下 SELECT:
(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_MESSAGE
连接起来,这样我就不会得到具有相同 [=14] 的两行=] 和两个不同的 IMPORT_MESSAGE
.
当我在查询中也使用 UNION
时,有没有办法在 Oracle 中实现这一点?
编辑
经过一些测试,它起作用了。只是一个澄清:为了让我的所有数据 和 我应该 select 的消息如下所示:
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 环境中使用 LISTAGG
功能。
例如(参见:http://www.sqlines.com/mysql/functions/group_concat):
SELECT LISTAGG(IMPORT_MESSAGE, ',') WITHIN GROUP (ORDER BY NULL)
FROM (
.... your union all select
) as YOURUNION
GROUP BY YOURUNION.IMPORT_MESSAGE;
我没有Oracle数据库,所以你得试试。
我有以下 SELECT:
(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_MESSAGE
连接起来,这样我就不会得到具有相同 [=14] 的两行=] 和两个不同的 IMPORT_MESSAGE
.
当我在查询中也使用 UNION
时,有没有办法在 Oracle 中实现这一点?
编辑
经过一些测试,它起作用了。只是一个澄清:为了让我的所有数据 和 我应该 select 的消息如下所示:
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 环境中使用 LISTAGG
功能。
例如(参见:http://www.sqlines.com/mysql/functions/group_concat):
SELECT LISTAGG(IMPORT_MESSAGE, ',') WITHIN GROUP (ORDER BY NULL)
FROM (
.... your union all select
) as YOURUNION
GROUP BY YOURUNION.IMPORT_MESSAGE;
我没有Oracle数据库,所以你得试试。