从外部 SQL 查询中的两列获取不同值并将其列表到一列中

问题描述 投票:0回答:1

我正在尝试将两列值组合成一列,该列将具有不同的值。

我知道如果查询是直接在表上形成的,我们可以使用 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
sql oracle plsql query-optimization
1个回答
0
投票

从 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;

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.