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

Jac*_*ada 90 mysql sql

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

它们具有不同的列数 - 例如,表A具有更多列.

如何将这两个表联合起来并为表B没有的列获取null?

Kan*_*kan 187

对于具有较少列的表,将额外列添加为null

Select Col1, Col2, Col3, Col4, Col5 from Table1
Union
Select Col1, Col2, Col3, Null as Col4, Null as Col5 from Table2
Run Code Online (Sandbox Code Playgroud)

  • 我意识到这个解决方案也可以工作,而不必列出所有列。因此,除了`Select Col1, Col2, Col3, Null as Col4, Null as Col5 from Table2`,你也可以这样做,`Select *, Null as Col4, Null as Col5 from Table2`。 (9认同)
  • 有没有办法填写Null列的默认值? (4认同)
  • @Hans:您可以像ColumnName或isnull(ColumnName,' - ')一样将isnull(ColumnName,0)作为ColumnName或类似的东西. (3认同)
  • 有什么有效的技巧吗——比如您想将 200 列表格与 2 列表格结合起来? (3认同)
  • @PratikPatel,您的解决方案仅在缺少的列是*最后一列*时才有效。您不能将“SELECT Col1, Col2, Null as Col3, Null as Col4, Col5”替换为“SELECT *, Null as Col3, Null as Col4”。 (2认同)

Ana*_*ips 6

我来到这里并按照上面的回答.但是数据类型顺序不匹配导致错误.以下来自另一个答案的描述将派上用场.

结果是否与表格中的列序列相同?因为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;
Run Code Online (Sandbox Code Playgroud)

ORA-01790:表达式必须与相应的表达式具有相同的数据类型

如您所见,错误的根本原因在于使用*作为列列表说明符所暗示的不匹配列排序.通过显式输入列列表可以轻松避免此类错误:

从test1_1790 union中选择col_a,col_b,col_c,从test2_1790中选择col_a,col_b,col_c; 此错误的更常见情况是,当您无意中交换(或转移)SELECT列表中的两个或更多列时:

select col_a, col_b, col_c from test1_1790
union all
select col_a, col_c, col_b from test2_1790;
Run Code Online (Sandbox Code Playgroud)

或者,如果上述方法无法解决您的问题,那么如何在列中创建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
Run Code Online (Sandbox Code Playgroud)


Luk*_*zda 5

通常,当您使用基于集合的运算符时,您需要具有相同数量的列,因此Kangkan 的答案是正确的。

\n

SAS SQL 有特定的运算符来处理这种情况:

\n
\n

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

\n

对应 (CORR) 关键字

\n

仅当指定集合运算符时才使用 CORRESPONDING 关键字。CORR 导致 PROC SQL 按名称而不是序号位置来匹配表表达式中的列。除 OUTER UNION 运算符外,名称不匹配的列将从结果表中排除。

\n
\n
SELECT * FROM tabA\nOUTER UNION CORR\nSELECT * FROM tabB;\n
Run Code Online (Sandbox Code Playgroud)\n

为了:

\n
+---+---+\n| a | b |\n+---+---+\n| 1 | X |\n| 2 | Y |\n+---+---+\n\nOUTER UNION CORR\n\n+---+---+\n| b | d |\n+---+---+\n| U | 1 |\n+---+---+\n\n<=>\n\n+----+----+---+\n| a  | b  | d |\n+----+----+---+\n|  1 | X  |   |\n|  2 | Y  |   |\n|    | U  | 1 |\n+----+----+---+\n
Run Code Online (Sandbox Code Playgroud)\n
\n

U-SQL支持类似的概念:

\n
\n

外部联合的名称为 (*)

\n

\n

需要 BY NAME 子句和 ON 列表。与其他集合表达式相反,OUTER UNION 的输出模式包括两侧的匹配列和不匹配列。这会造成一种情况,即来自一侧的每一行都有“缺失的列”,这些列仅存在于另一侧。对于此类列,为“缺失单元格”提供默认值。对于可为 null 的类型,默认值为 null;对于不可为 null 的类型,默认值为 .Net(例如,对于 int 为 0)。

\n

按名字

\n

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

\n

如果 ON 子句包含 \xe2\x80\x9c*\xe2\x80\x9d 符号(可以将其指定为列表的最后一个或唯一成员),则允许超出 ON 子句中的名称匹配, result\xe2\x80\x99s 列包括所有匹配的列,按照它们在左侧参数中出现的顺序排列。

\n
\n

和代码:

\n
@result =    \n    SELECT * FROM @left\n    OUTER UNION BY NAME ON (*) \n    SELECT * FROM @right;\n
Run Code Online (Sandbox Code Playgroud)\n
\n

编辑:

\n

KQL支持外联合的概念:

\n
\n

种类:

\n

内部 - 结果具有所有输入表共有的列子集。

\n

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

\n
\n

例子:

\n
let t1 = datatable(col1:long, col2:string)  \n[1, "a",  \n2, "b",\n3, "c"];\nlet t2 = datatable(col3:long)\n[1,3];\nt1 | union kind=outer t2;\n
Run Code Online (Sandbox Code Playgroud)\n

输出:

\n
+------+------+------+\n| col1 | col2 | col3 |\n+------+------+------+\n|    1 | a    |      |\n|    2 | b    |      |\n|    3 | c    |      |\n|      |      |    1 |\n|      |      |    3 |\n+------+------+------+\n
Run Code Online (Sandbox Code Playgroud)\n
\n

DuckDB - 按名称联合(全部)

\n
\n

UNION (ALL) BY NAME 子句可用于按名称(而不是按位置)组合不同表中的行。UNION BY NAME 不要求两个查询具有相同的列数。仅在其中一个查询中找到的任何列都将在另一个查询中填充 NULL 值。

\n
SELECT * FROM capitals UNION BY NAME SELECT * FROM weather;\n\n\n\xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90\n\xe2\x94\x82   city    \xe2\x94\x82 country \xe2\x94\x82 degrees \xe2\x94\x82    date    \xe2\x94\x82\n\xe2\x94\x82  varchar  \xe2\x94\x82 varchar \xe2\x94\x82  int32  \xe2\x94\x82    date    \xe2\x94\x82\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xa4\n\xe2\x94\x82 Amsterdam \xe2\x94\x82 NULL    \xe2\x94\x82      10 \xe2\x94\x82 2022-10-14 \xe2\x94\x82\n\xe2\x94\x82 Seattle   \xe2\x94\x82 NULL    \xe2\x94\x82       8 \xe2\x94\x82 2022-10-12 \xe2\x94\x82\n\xe2\x94\x82 Amsterdam \xe2\x94\x82 NL      \xe2\x94\x82    NULL \xe2\x94\x82 NULL       \xe2\x94\x82\n\xe2\x94\x82 Berlin    \xe2\x94\x82 Germany \xe2\x94\x82    NULL \xe2\x94\x82 NULL       \xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98\n
Run Code Online (Sandbox Code Playgroud)\n
\n