上周,我惊讶地发现sybase 12不支持完全外连接。 但是我想到一个完整的外连接应该与一个左外连接相同,并与同一个sql的右外连接联合。 任何人都可以想到一个不合适的理由吗?
答案 0 :(得分:1)
UNION
- 两个OUTER JOIN
语句应该会产生重复的行,表示您从INNER JOIN
获取的数据。您可能必须对SELECT DISTINCT
生成的数据集执行UNION
。通常,如果你必须使用SELECT DISTINCT
,这意味着它不是一个设计良好的查询(或者我听说过)。
答案 1 :(得分:1)
如果你将它们与UNION ALL
联合起来,你就会得到重复。如果您只使用UNION
而不使用ALL
,它将过滤重复项,因此相当于完全加入,但查询也会更加昂贵,因为它必须执行不同的排序。 / p>
答案 2 :(得分:1)
UNION ALL
左连接与右连接,但是将右连接限制为只有基表中不存在的行(如果连接中存在空值,则它们在表中不为空时返回null )。
对于此代码,您需要创建两个表t1和t2。 t1应该有一个名为c1的列,其中五行包含值1-5。 t2还应该有一个包含值为2-6的五行的c1列。
Full Outer Join:
select * from t1 full outer join t2 on t1.c1=t2.c1 order by 1, 2;
Full Outer Join等效:
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子句将结果限制为只有那些不重复的结果。
答案 3 :(得分:0)
首先,我不知道你为什么使用12.x.在2007年4月3日获得通知后,于2009年12月31日为EndOfLifed。15.0.2(第一个固体版本)于2009年1月发布.15.5更好,可用于2009年12月2日,所以你是两个主要版本,至少13个月,已过期。
ASE 12.5.4具有新的Join语法。 (您尚未指定,您可能在12.5.0.3之前,即之前的版本。)
DB2和Sybase没有实现FULL OUTER JOIN
,正是因为您确定了这一点:LEFT ... UNION ... RIGHT
没有ALL
。这不是“不支持”FOJ的情况;这是关键字丢失的情况。
然后你遇到的问题是Sybase和DB2类型通常不会使用外连接,更不用说FOJ了,因为它们的数据库往往更加规范化等等。
最后,您可以在任何版本的Sybase中使用完全普通的SQL来提供FOJ的功能,并且在12.x上会明显更快;在15.x上仅略快一点。它有点像RANK()函数:如果你可以写一个子查询,那就很不必要了。
它不需要FULL OUTER
的第二个原因,正如一些低端引擎所做的那样,是因为新的优化器非常快,并且查询完全正常化。 IE浏览器。它一次性执行LEFT和RIGHT。
根据您的SARG和DataType不匹配等情况,它可能仍然需要排序合并,但这也是所有三个级别的流式传输:磁盘I / O子系统;引擎);和网络处理程序。如果您的表是分区的,那么它还会在该级别进行并行化。
如果您的服务器未配置且,您的结果集非常大,则可能需要增加proc cache size
和number of sort buffers
。就是这样。