oracle 表中多列的并集

cidc1ykv  于 2023-10-16  发布在  Oracle
关注(0)|答案(3)|浏览(90)

假设我有这样的table

Col1    Col2    Col3    Col4
A       X       ADesc   XDesc
A       Y       ADesc   YDesc
B       Y       BDesc   YDesc
C       Z       CDesc   ZDesc
C       W       CDesc   WDesc

假设Col1和Col2是代码,Col3和Col4是它们各自的描述。意思是Col3是Col1的描述。类似地,Col4是Col2的desc。我想找到所有不同的代码(单独的代码,而不是对)和他们的描述
结果应该是

A  ADesc
B  BDesc
C  CDesc
X  XDesc
Y  YDesc
Z  ZDesc
W  WDesc

如何编写查询。我在想这样的事,但它不起作用

select Col1 as Code, Col2 as Desc from <tableA>
union
select Col3, Col4 from <tableA>;

也不知道如何区分。例如,有两个条目A,C,Y,但我只需要一个。

ercv8c1e

ercv8c1e1#

试试下面这样的东西:

SELECT DISTINCT Col1 AS Code, Col3 AS Description
FROM YourTable
UNION
SELECT DISTINCT Col2 AS Code, Col4 AS Description
FROM YourTable;
zpgglvta

zpgglvta2#

在查询中,第一个SELECT中列出的代码列(Col1,Col2)和说明列(Col3,Col4)在UNION查询的第二个SELECT中列出,导致返回不同的结果。更改SELECT中的列将给予您想要的结果。

SELECT Col1 AS Code, Col3 AS [Desc] FROM MyTable
UNION
SELECT Col2, Col4 FROM MyTable
7ivaypg9

7ivaypg93#

使用UNPIVOT只查询表一次:

SELECT DISTINCT code, description
FROM   table_name
UNPIVOT (
  (code, description) FOR type IN (
    (Col1, Col3) AS '1+3',
    (Col2, Col4) AS '2+4'
  )
);

其中,对于样本数据:

CREATE TABLE table_name (col1, col2, col3, col4) AS
SELECT 'A', 'X', 'ADesc', 'XDesc' FROM DUAL UNION ALL
SELECT 'A', 'Y', 'ADesc', 'YDesc' FROM DUAL UNION ALL
SELECT 'B', 'Y', 'BDesc', 'YDesc' FROM DUAL UNION ALL
SELECT 'C', 'Z', 'CDesc', 'ZDesc' FROM DUAL UNION ALL
SELECT 'C', 'W', 'CDesc', 'WDesc' FROM DUAL;

输出:
| 代码|描述|
| --|--|
| 一|ADesc|
| X| XDesc|
| Y| YDesc|
| B| BDesc|
| C| CDesc|
| Z| ZDesc|
| W| WDesc|
您还可以使用:用途:

SELECT col1 AS code, col3 AS description FROM table_name
UNION
SELECT col2, col4 FROM table_name;

它给出相同的输出;但是,它将查询表两次(每个SELECT查询一次),因此效率可能较低。
下面的fiddle包含了两个查询的EXPLAIN PLAN s,显示UNPIVOT使用了一个TABLE ACCESS FULL,而使用UNION有两个TABLE ACCESS FULL
fiddle

相关问题