从具有不同列的多个Oracle表中选择

kqqjbcuj  于 2023-02-03  发布在  Oracle
关注(0)|答案(2)|浏览(233)

你好,我正在使用选择与联合选择ftom 8表。这些表有一些共同的领域和一些独特的领域,以每个表。我得到错误时,使用联合或联合所有由于不同的列数。
我想保留所有表中的所有列。有什么想法吗?
谢谢

4xy9mtcn

4xy9mtcn1#

这里的评论有点长。老实说,听起来你想要一个JOIN而不是UNION。联合向现有列添加数据行,连接水平添加数据列。
但是,对于您的UNION问题,对于不同的表,没有一种简单的方法来执行类似SELECT * UNION SELECT *的操作,您必须显式地选择所有列。
在这种情况下,您需要考虑两件事,这两件事都是因为由联合组合的每个选择必须包含相同数量的列。
1.顶部的SELECT控制列的名称,因此在那里处理所有别名
1.不存在于SELECT中的每一列都需要处理,通常由NULL''处理
(ex. col1从顶部SELECT返回,但不存在,因此无法从第二个SELECT拉出)
所以你最终会得到这样的结果:

SELECT col1 as A,
       NULL as B,
       NULL as C,
FROM table1
UNION
SELECT NULL,
       col2,
       NULL
FROM table2
UNION
SELECT NULL,
       NULL,
       col3
FROM table3

如果您需要更多信息,请编辑您的问题以包括当前查询、表和错误

3qpi33ja

3qpi33ja2#

让我们试着比较3个不同行数和列数的表的连接和联合。有些是相同的,有些则不是。
样本数据

WITH
    tbl_1 AS
        (
            Select 1 "ID_NUMBER", 'Name for ID 1' "NAME_VARCHAR", To_Date('27.11.1987', 'dd.mm.yyyy') "BIRTH_DATE" From Dual Union All
            Select 2 "ID_NUMBER", 'Name for ID 2' "NAME_VARCHAR", To_Date('29.05.1989', 'dd.mm.yyyy') "BIRTH_DATE" From Dual 
        ),
/*   ID_NUMBER NAME_VARCHAR  BIRTH_DATE
    ---------- ------------- ----------
             1 Name for ID 1 27-NOV-87  
             2 Name for ID 2 29-MAY-89    */
    tbl_2 AS
        (
            Select 1 "ID_NUMBER", 1 "PROPERTY_ID_NUMBER", 'France' "PROPERTY_STATE_VARCHAR", 150000 "PROPERTY_VALUE_NUMBER",  To_Date('12.11.2018', 'dd.mm.yyyy') "PROPERTY_BUYING_DATE" From Dual Union All
            Select 1 "ID_NUMBER", 2 "PROPERTY_ID_NUMBER", 'Spain'  "PROPERTY_STATE_VARCHAR", 120000 "PROPERTY_VALUE_NUMBER",  To_Date('10.03.2019', 'dd.mm.yyyy') "PROPERTY_BUYING_DATE" From Dual Union All
            Select 2 "ID_NUMBER", 1 "PROPERTY_ID_NUMBER", 'France' "PROPERTY_STATE_VARCHAR", 200000 "PROPERTY_VALUE_NUMBER",  To_Date('11.10.2020', 'dd.mm.yyyy') "PROPERTY_BUYING_DATE" From Dual 
        ),
/*   ID_NUMBER PROPERTY_ID_NUMBER PROPERTY_STATE_VARCHAR PROPERTY_VALUE_NUMBER PROPERTY_BUYING_DATE
    ---------- ------------------ ---------------------- --------------------- --------------------
             1                  1 France                                150000 12-NOV-18            
             1                  2 Spain                                 120000 10-MAR-19            
             2                  1 France                                200000 11-OCT-20          */
    tbl_3 AS
        (
            Select 1 "ID_NUMBER", 'France' "STATE_VARCHAR" From Dual Union All
            Select 2 "ID_NUMBER", 'Spain'   "STATE_VARCHAR" From Dual 
        )
/*   ID_NUMBER STATE_VARCHAR
    ---------- -------------
             1 France        
             2 Spain       */

1.工会
您必须确保所有联合选择语句的列数和数据类型相同。第一个选择语句可以定义这两种类型。如果第一个选择语句选择了空值,则将其转换为适当的数据类型。您还可以在同一列中放入不同来源的数据,因此,为了清楚起见,你可以为每一行添加原点信息。2下面是使用并集选择所有数据的选项之一:

--  UNION
Select 'Table 1 - Name'             "DATA_SOURCE",  ID_NUMBER "ID_1", CAST(Null as Number(5)) "ID_2", NAME_VARCHAR "A_NAME",    BIRTH_DATE "A_DATE",      CAST(Null as Number(14,2)) "A_VALUE"  From tbl_1 Union All
Select 'Table 2 - Ownership',                       ID_NUMBER,        PROPERTY_ID_NUMBER,             PROPERTY_STATE_VARCHAR,   PROPERTY_BUYING_DATE,     PROPERTY_VALUE_NUMBER                 From tbl_2 Union All
Select 'Table 3 - Nationality',                     ID_NUMBER,        NULL,                           STATE_VARCHAR,            NULL,                     NULL                                  From tbl_3

结果
| 数据源|识别码_1|身份证_2|A_名称|日期|A_值|
| - ------|- ------|- ------|- ------|- ------|- ------|
| 表1-名称|1个||ID 1的名称|一九八七年十一月二十七日||
| 表1-名称|第二章||ID 2的名称|一九八九年五月二十九日||
| 表2-所有权|1个|1个|法国|2018年11月12日|十五万|
| 表2-所有权|1个|第二章|西班牙|2019年3月10日|十二万|
| 表2-所有权|第二章|1个|法国|2020年10月11日|二十万|
| 表3-国籍|1个||法国|||
| 表3-国籍|第二章||西班牙|||
1.加入

--  JOIN
Select      t1.ID_NUMBER "ID", t1.NAME_VARCHAR "A_NAME", t1.BIRTH_DATE "BORN",
            t2.PROPERTY_ID_NUMBER "PROPERTY_ID", t2.PROPERTY_STATE_VARCHAR "PROPERTY_STATE", t2.PROPERTY_BUYING_DATE "BOUGHT", t2.PROPERTY_VALUE_NUMBER "PROPERTY_VALUE",
            t3.STATE_VARCHAR "NATIONALITY"
From        tbl_1 t1
Left Join   tbl_2 t2 ON(t2.ID_NUMBER = t1.ID_NUMBER)
Left Join   tbl_3 t3 ON(t3.ID_NUMBER = t1.ID_NUMBER)

结果
| 识别号|A_名称|出生|属性ID|属性_状态|购买|属性_值|国籍|
| - ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|
| 1个|ID 1的名称|一九八七年十一月二十七日|1个|法国|2018年11月12日|十五万|法国|
| 1个|ID 1的名称|一九八七年十一月二十七日|第二章|西班牙|2019年3月10日|十二万|法国|
| 第二章|ID 2的名称|一九八九年五月二十九日|1个|法国|2020年10月11日|二十万|西班牙|
根据你的数据结构和你想要得到什么,你将选择一种或另一种方式。

相关问题