SQL 没有明确列出列名的联合 NULL 列
SQL Union NULL Columns without explicitly list column names
我有两个 table 非常宽(30 列)但具有非常相似的架构(两个 table 共享 20 多列)。我想将这两个 table 合并在一起,但希望新的 table 具有来自两个 table 的所有字段。
类似于 this Whosebug question 的想法。
但是,当我开始编写查询时,挑战就出现了,我必须指定每个 table 中的所有列,不仅如此,还要使用 NULL 来填充仅存在于另一个 table。
像这样:
select
commoncolumn1,
commoncolumn2,
table1_only_column1,
NULL as table2_only_column1
...
from table1
union all
select
commoncolumn1,
commoncolumn2,
NULL as table1_only_column1,
table2_only_column1
...
来自 table2
随着列数的增加,此查询变得非常长,并且对模式更改也不太健壮。有没有更好的合并两个 tables 的方法,它自动为不存在的 tables 填充 NULL?
我正在使用 Impala/Hive,但如果有一个 ANSI 方法可以做到这一点,那就太好了!
来自 Wikipedia(强调我的):
In SQL the UNION clause combines the results of two SQL queries into a single table of all matching rows. The two queries must result in the same number of columns and compatible data types in order to unite.
所以简而言之,您必须为不适用的列指定 NULL
。您可以编写一些脚本来生成 SQL,或使用同一列(另一列指示它是哪个属性),但您有点受限。
不熟悉 Hive/Impala,那里可能有更好的选择。
物有所值,here's the MySQL reference page UNION
。有趣的是,它没有明确说明需要相同数量的列(尽管这可能只是因为它是假定的)。
正如@AlexM 指出的那样,SELECT *
可能是一个选项。但是,您要小心这一点,因为列的顺序可能会更改,或者可能会添加新列,这会破坏 UNION
查询(针对使用 SELECT *
的标准警告)。
FWIW,SQL UNION 将按顺序位置而不是名称匹配列。如果列名在两个 SELECT 中相同,那么这也是结果列的名称。如果不是,则结果的列名称为 "implementation-defined".
所有这一切的 meaning/consequence 是您有责任提防 两者 SELECT 中的列 以及 这些列的相同命名(如果您希望后续在 UNION 的结果中引用这些列可以通过使用名称而不是列号来实现)。
这就是标准要求合规实现的行为方式,因此您几乎没有机会找到可以减轻您因该问题而遭受的痛苦的实现。
我有两个 table 非常宽(30 列)但具有非常相似的架构(两个 table 共享 20 多列)。我想将这两个 table 合并在一起,但希望新的 table 具有来自两个 table 的所有字段。
类似于 this Whosebug question 的想法。
但是,当我开始编写查询时,挑战就出现了,我必须指定每个 table 中的所有列,不仅如此,还要使用 NULL 来填充仅存在于另一个 table。
像这样:
select
commoncolumn1,
commoncolumn2,
table1_only_column1,
NULL as table2_only_column1
...
from table1
union all
select
commoncolumn1,
commoncolumn2,
NULL as table1_only_column1,
table2_only_column1
...
来自 table2
随着列数的增加,此查询变得非常长,并且对模式更改也不太健壮。有没有更好的合并两个 tables 的方法,它自动为不存在的 tables 填充 NULL?
我正在使用 Impala/Hive,但如果有一个 ANSI 方法可以做到这一点,那就太好了!
来自 Wikipedia(强调我的):
In SQL the UNION clause combines the results of two SQL queries into a single table of all matching rows. The two queries must result in the same number of columns and compatible data types in order to unite.
所以简而言之,您必须为不适用的列指定 NULL
。您可以编写一些脚本来生成 SQL,或使用同一列(另一列指示它是哪个属性),但您有点受限。
不熟悉 Hive/Impala,那里可能有更好的选择。
物有所值,here's the MySQL reference page UNION
。有趣的是,它没有明确说明需要相同数量的列(尽管这可能只是因为它是假定的)。
正如@AlexM 指出的那样,SELECT *
可能是一个选项。但是,您要小心这一点,因为列的顺序可能会更改,或者可能会添加新列,这会破坏 UNION
查询(针对使用 SELECT *
的标准警告)。
FWIW,SQL UNION 将按顺序位置而不是名称匹配列。如果列名在两个 SELECT 中相同,那么这也是结果列的名称。如果不是,则结果的列名称为 "implementation-defined".
所有这一切的 meaning/consequence 是您有责任提防 两者 SELECT 中的列 以及 这些列的相同命名(如果您希望后续在 UNION 的结果中引用这些列可以通过使用名称而不是列号来实现)。
这就是标准要求合规实现的行为方式,因此您几乎没有机会找到可以减轻您因该问题而遭受的痛苦的实现。