联合两个具有不同列数的表

我有两张桌子(表 A 和表 B)。

它们有不同的列数-比如说表 A 有更多的列。

如何联合这两个表并为表 B 没有的列获得 null?

288139 次浏览

为列数较少的表添加额外的空列,如

Select Col1, Col2, Col3, Col4, Col5 from Table1
Union
Select Col1, Col2, Col3, Null as Col4, Null as Col5 from Table2

我来到这里,遵循上述答案。但是 Order 的数据类型不匹配导致了错误。下面的描述来自另一个答案将会派上用场。

上面的结果是否与表中列的顺序相同?因为 Oracle 对列的顺序很严格。下面的例子产生了一个错误:

create table test1_1790 (
col_a varchar2(30),
col_b number,
col_c date);


create table test2_1790 (
col_a varchar2(30),
col_c date,
col_b number);


select * from test1_1790
union all
select * from test2_1790;

表达式必须与对应的表达式具有相同的数据类型

正如您所看到的,错误的根源在于使用 * 作为列列表说明符所暗示的不匹配的列顺序。通过显式输入列列表,可以很容易地避免此类错误:

从 test1 _ 1790中选择 cola,colb,colc 工会 从 test2 _ 1790中选择 cola,colb,colc; 此错误更常见的情况是无意中交换(或移位) SELECT 列表中的两个或多个列:

select col_a, col_b, col_c from test1_1790
union all
select col_a, col_c, col_b from test2_1790;

或者,如果上述方法不能解决您的问题,那么在列中创建 ALIAS 如何: (查询与您的查询不同,但这里的关键是如何在列中添加别名。)

SELECT id_table_a,
desc_table_a,
table_b.id_user as iUserID,
table_c.field as iField
UNION
SELECT id_table_a,
desc_table_a,
table_c.id_user as iUserID,
table_c.field as iField

如果只有1行,则可以使用 join

Select t1.Col1, t1.Col2, t1.Col3, t2.Col4, t2.Col5 from Table1 t1 join Table2 t2;

通常,在使用基于集的运算符时,需要具有相同数量的列,因此 康康的回答是正确的。

SAS SQL 有特定的操作符来处理这种情况:

SAS (R)9.3 SQL 过程用户指南

对应(CORR)关键字

只有在指定了集合运算符时才使用 CORRESPONING 关键字。CORR 使 PROCSQL 按名称而不是按顺序位置匹配表表达式中的列。除 OUTERUNION 运算符外,不按名称匹配的列将被排除在结果表之外。

SELECT * FROM tabA
OUTER UNION CORR
SELECT * FROM tabB;

致:

+---+---+
| a | b |
+---+---+
| 1 | X |
| 2 | Y |
+---+---+


OUTER UNION CORR


+---+---+
| b | d |
+---+---+
| U | 1 |
+---+---+


<=>


+----+----+---+
| a  | b  | d |
+----+----+---+
|  1 | X  |   |
|  2 | Y  |   |
|    | U  | 1 |
+----+----+---+

U-SQL 支持类似的概念:

按名称(*)的外部联盟

外面

需要 BY NAME 子句和 ON 列表。与其他集合表达式不同,OUTER UNION 的输出模式包括来自两侧的匹配列和不匹配列。这就造成了一种情况,即来自其中一侧的每一行都有“缺失的列”,而这些列只出现在另一侧。对于这些列,为“缺少的单元格”提供默认值。对于可为空的类型,默认值为空,而。非空类型的净默认值(例如,int 为0)。

名字

与 OUTER 一起使用时需要。子句指示联合不是根据位置而是根据列的名称来匹配值。如果未指定 BY NAME 子句,则按位置进行匹配。

如果 ON 子句包含“ *”符号(它可能被指定为列表的最后一个或唯一一个成员) ,那么允许在 ON 子句之外进行额外的名称匹配,并且结果的列包含所有匹配的列,按照它们在左参数中出现的顺序。

还有密码:

@result =
SELECT * FROM @left
OUTER UNION BY NAME ON (*)
SELECT * FROM @right;

编辑:

外部联盟的概念得到 KQL 的支持:

种类:

Inner-结果包含所有输入表通用的列子集。

Out-结果包含出现在任何输入中的所有列。未由输入行定义的单元格设置为空。

例如:

let t1 = datatable(col1:long, col2:string)
[1, "a",
2, "b",
3, "c"];
let t2 = datatable(col3:long)
[1,3];
t1 | union kind=outer t2;

产出:

+------+------+------+
| col1 | col2 | col3 |
+------+------+------+
|    1 | a    |      |
|    2 | b    |      |
|    3 | c    |      |
|      |      |    1 |
|      |      |    3 |
+------+------+------+

小样