我正在尝试将两列值组合成一列,该列将具有不同的值。
我知道如果查询是直接在表上形成的,我们可以使用 UNION 来完成,但是如果数据是在 SQL QUERY 中形成的,如示例中所示,它有超过 100 列,我怎样才能得到相同的输出用我的数据解释。
如果我使用相同的解决方案,我必须重复外部查询两次才能使用联合,然后过滤唯一数据。
例如:
SELECT DISTINCT ID, key_code, LOC_ID FROM
(
SELECT /*SOME 100 COLUMN*/, LOC_ID_1, LOC_ID_2 FROM TABLE 1
UNION ALL
SELECT /*SOME 100 COLUMN*/, LOC_ID_1, LOC_ID_2 FROM TABLE 2
UNION ALL
SELECT /*SOME 100 COLUMN*/, LOC_ID_1, LOC_ID_2 FROM TABLE 3
)
在给定示例中执行类似于 /使用 DELIMITER 获取唯一数据/ 联合组合的操作是否是一个好的解决方案。
--如果您需要更多信息,请指导
/*CREATE TABLE*//
CREATE TABLE get_data (
id NUMBER,
key_code NUMBER,
loc_id_1 VARCHAR2(20),
loc_id_2 VARCHAR2(20)
);
/*INSERT DATA*/
INSERT INTO get_data (id,key_code,loc_id_1,loc_id_2) values (1,101,'522','545');
INSERT INTO get_data (id,key_code,loc_id_1,loc_id_2) values (1,101,'522','546');
INSERT INTO get_data (id,key_code,loc_id_1,loc_id_2) values (1,101,'523','547');
INSERT INTO get_data (id,key_code,loc_id_1,loc_id_2) values (1,101,'550','545');
INSERT INTO get_data (id,key_code,loc_id_1,loc_id_2) values (2,201,'721','344');
INSERT INTO get_data (id,key_code,loc_id_1,loc_id_2) values (2,201,'821','451');
INSERT INTO get_data (id,key_code,loc_id_1,loc_id_2) values (2,201,'821','653');
/*QUERY DATA*/
SELECT * FROM get_data ORDER BY 1;
/*QUERY OUTPUT*/
ID KEY_CODE LOC_ID_1 LOC_ID_2
1 101 522 545
1 101 522 546
1 101 523 547
1 101 550 545
2 201 721 344
2 201 821 451
2 201 821 653
/*GETTING UNIQUE DATA WITH DELIMITER from both LOC_ID_1 AND LOC_ID_2*/
SELECT DISTINCT ID,key_code,
LISTAGG(loc_id,'||') WITHIN GROUP (ORDER BY loc_id) OVER (PARTITION BY ID) AS loc_id FROM (
SELECT ID,key_code,loc_id_1 AS loc_id FROM get_data
UNION
SELECT ID,key_code,loc_id_2 AS loc_id FROM get_data
);
/*OUTPUT FROM ABOVE QUERY*/
ID KEY_CODE LOC_ID
1 101 522||523||545||546||547||550
2 201 344||451||653||721||821
从 Oracle 19 开始,
UNPIVOT
,然后使用 LISTAGG(DISTINCT ...) ...
:
SELECT ID,
key_code,
LISTAGG(DISTINCT loc_id,'||') WITHIN GROUP (ORDER BY loc_id) AS loc_id
FROM get_data
UNPIVOT (
loc_id FOR key IN (loc_id_1 AS 1, loc_id_2 AS 2)
)
GROUP BY id, key_code;
在 Oracle 19 之前,
UNPIVOT
,然后在外部查询中使用 DISTINCT
,然后使用 LISTAGG
:
SELECT ID,
key_code,
LISTAGG(loc_id,'||') WITHIN GROUP (ORDER BY loc_id) AS loc_id
FROM (
SELECT DISTINCT
ID,
key_code,
loc_id
FROM get_data
UNPIVOT (
loc_id FOR key IN (loc_id_1 AS 1, loc_id_2 AS 2)
)
)
GROUP BY id, key_code;