联盟表按字段名称? (即无法保证列顺序)

时间:2011-03-05 04:22:58

标签: sql union field

我想通过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”还是什么?

2 个答案:

答案 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查询的每个单独部分中以正确的顺序列出列名。