如何做一个完整的外部加入不具有充分外加入的提供
-
21-09-2019 - |
题
上周,我惊讶地发现,sybase12并不完全支持外联接。但我想到,一个充分外加入应该是相同的左外部加入联合的权利外加相同的sql。谁能想到的一个原因,这不会举行真的吗?
解决方案
UNION
-ING 2个OUTER JOIN
报表应导致表示你会从INNER JOIN
获取数据重复行。你必须做可能由SELECT DISTINCT
产生的数据集的UNION
。一般来说,如果你必须使用一个SELECT DISTINCT
这意味着它不是一个精心设计的查询(或使我听说)。
其他提示
如果你的工会他们UNION ALL
,你会得到重复。如果你只是使用UNION
没有ALL
,它会过滤重复的,因此等同于一个完整的加盟,但查询也将是一个昂贵得多,因为它必须执行一个不同的排序。
UNION ALL
左侧加入与加盟权,但限制右连接到不基表(返回上加入空时,则它们存在就不会在表空)只存在于行。
有关这段代码,你需要创建两个表t1和t2。 T1应该有一个命名为c1一列包含的值1-5五行。 T2也应该有一个C1柱用含有2-6值五排。
全外连接:
select * from t1 full outer join t2 on t1.c1=t2.c1 order by 1, 2;
全外连接等效:
select t1.c1, t2.c1 from t1 left join t2 on t1.c1=t2.c1
union all
select t1.c1, t2.c1 from t1 right join t2 on t1.c1=t2.c1
where t1.c1 is null
order by 1, 2;
请注意将结果限制为只有那些不会重复右侧的where子句加入选择。
首先,我不知道你为什么使用的12.x.它是 EndOfLifed 在31日2009年,在已经被通知在3月,2007年。15.0.2(第一固版本)中出来在月2009年。15.5是更好的和可02Dec.2009年,所以你是两个主要发布,并在至少13个月,出的日期。
ASE12.5.4有新加入的语法。(你还没有指定,则可以在12.5.0.3,释放之前到那)。
DB2and Sybase没有实现
FULL OUTER JOIN
, 为精确的因为你已经确定:它是由LEFT ... UNION ... RIGHT
没有ALL
.它不是一个情况下"不支持"一个FOJ;这是一个案例的关键词是失踪。然后你有问题Sybase和DB2类型一般会从来没有使用外加入让我们单独FOJs,因为它们的数据库的数据往往更加正规化,等等。
最后,有的是完美的普通SQL可以使用的任何版本的Sybase,将供应功能的FOJ,并将明显快于12.x;只稍微快在15.x.它是一种喜欢的排名()function:相当不必要的,如果你可以写一个子查询。
第二个原因它不需要
FULL OUTER
, 一些低端发动机这样做,是因为新的优化非常快,和查询是完全正常.Ie。它执行左右在一个单一的通过。取决于你Sarg和数据类型的不匹配,等等,它仍可能需要排序合并,但也是传输,在所有三个层次:磁盘I/O子系统;发动机(s);和网络的处理程序。如果你的表均分配,然后是另外并行在这一水平。
如果你不配置服务器 和 你的结果设定是非常大的,可能需要增加
proc cache size
和number of sort buffers
.这就是全部。