联合所有对应和外部联合对应的任何区别?

时间:2014-02-03 21:24:36

标签: sql sas

有人可以验证我对proc sql union操作的理解吗?我对外部联盟和工会之间差异的解释如下:

  1. Union删除重复的行,而外部联合不删除

  2. Union将覆盖列,而默认情况下,外部联合不会。

  3. 那么,联合所有对应和外部联合对应的会有什么区别吗?看起来“ALL”会删除第一个差异,而“CORRESPONDING”会消除第二个差异,但我担心两者之间可能存在额外的差异。我不知道。

3 个答案:

答案 0 :(得分:2)

我的理解是OUTER UNIONUNION ALL实际上是有效的,如果不相同的话。任何一个都需要CORR来保证列对齐;使用OUTER UNION即使列 相同,列也不会堆叠,而UNION ALL总是堆栈,即使它们不相同(必须是相同的数据类型或它会错误),并且根本不关注列名。在这两种情况下,添加CORR都会导致它们堆叠。

以下是一些例子:

不堆叠:

proc sql;
select height, weight from sashelp.class
union all 
select weight,height from sashelp.class;
select height, weight from sashelp.class
outer union
select height, weight from sashelp.class;
quit;

堆积:

proc sql;
select height, weight from sashelp.class
union all corr
select weight,height from sashelp.class;
select height, weight from sashelp.class
outer union corr
select height, weight from sashelp.class;
quit;

This SAS doc page很好地展示了这些差异。

答案 1 :(得分:2)

事实证明,实际上存在差异:如何处理仅存在于一个数据集中的列。 Outer Union Corresponding将显示仅出现在一个数据集中的列,而不是按位置覆盖。 Union All Corresponding不会显示仅出现在一个数据集中的任何列。

答案 2 :(得分:1)

尝试这些代码,您将清楚看到它们的区别:

测试数据:

data data1;
input id $ expense;
cards;
001 9
001 8
003 7
;
run;


data data2;
input id $ cost;
cards;
001 30
002 80
;
run;

这是所有工会的结果:

proc sql;
select
Id,
sum(Expense) label='COST'
from WORK.data1
group by 1
union all
select
Id,
sum(Cost)
from WORK.data2
group by 1
order by 1,2
;
run;

这是由外部联合更正导致的:

proc sql;
select
Id,
sum(Expense) as Cost
from WORK.data1
group by Id
outer union corr
select
Id,
sum(Cost)
from WORK.data2
group by Id
order by 1,2
;
run;