我想通过UNION堆栈表,但是按字段名称进行堆栈,因为表中的字段大多相同,但每个表可能没有所有字段,列顺序可能不同。 E.g。
Table 1 Table 2 Table 3 Table 4
Age Age Age Height
Height Height Height Weight
Weight Weight Weight Age
Race Race Gender Gender
--- Gender
例如,以下示例可能会在下面的示例中断开:
SELECT * FROM TABLE 1
UNION ALL SELECT * FROM TABLE 2
UNION ALL SELECT * FROM TABLE 3
UNION ALL SELECT * FROM TABLE 4
激励性的例子是季度或年度波浪的调查。有时字段会被删除,其他字段每年都会被添加我现在想建立一个流程,不需要过多关注映射过去的变化或因未来的微小变化而中断。
SAS等语言将按名称处理优雅匹配的列。有没有办法在SQL中简洁地做到这一点,比如“UNION ALL BY NAME”还是什么?
答案 0 :(得分:4)
我相信UNION所有表所需要的只是它们具有相同数量的具有相似数据类型的列
所以我想你可以做到
SELECT age, height, weight, gender, race FROM TABLE 1
UNION ALL SELECT age, height, weight, gender, race FROM TABLE 2
UNION ALL SELECT age, height, weight, gender, race FROM TABLE 3
UNION ALL SELECT age, height, weight, gender, race FROM TABLE 4
如果例如表3没有竞赛领域,你可以用它替换它。
SELECT age, height, weight, gender, null AS race FROM TABLE 3
或另一个默认值而不是null。
答案 1 :(得分:4)
SQL标准BNF语法的一部分包括:
<non-join query expression> ::=
<non-join query term>
| <query expression body> UNION [ALL|DISTINCT] [ <corresponding spec> ] <query term>
| <query expression body> EXCEPT [ALL|DISTINCT] [ <corresponding spec> ] <query term>
<corresponding spec> ::= CORRESPONDING
[ BY <left paren> <corresponding column list> <right paren> ]
<corresponding column list> ::= <column name list>
<column name list> ::= <column name> [ { <comma> <column name> }... ]
因此,理论上,您可以使用CORRESPONDING子句来实现您所需的效果。但是,并非所有DBMS都支持该表示法 - 您需要阅读手册才能找到答案。
如果CORRESPONDING表示法不可用,则必须在UNION查询的每个单独部分中以正确的顺序列出列名。