如何在没有完全外部联接的情况下执行完全外部联接

时间:2010-01-18 22:23:20

标签: sql sybase-ase full-outer-join

上周,我惊讶地发现sybase 12不支持完全外连接。 但是我想到一个完整的外连接应该与一个左外连接相同,并与同一个sql的右外连接联合。 任何人都可以想到一个不合适的理由吗?

4 个答案:

答案 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)

  1. 首先,我不知道你为什么使用12.x.在2007年4月3日获得通知后,于2009年12月31日为EndOfLifed。15.0.2(第一个固体版本)于2009年1月发布.15.5更好,可用于2009年12月2日,所以你是两个主要版本,至少13个月,已过期。

  2. ASE 12.5.4具有新的Join语法。 (您尚未指定,您可能在12.5.0.3之前,即之前的版本。)

  3. DB2和Sybase没有实现FULL OUTER JOIN,正是因为您确定了这一点:LEFT ... UNION ... RIGHT没有ALL。这不是“不支持”FOJ的情况;这是关键字丢失的情况。

  4. 然后你遇到的问题是Sybase和DB2类型通常不会使用外连接,更不用说FOJ了,因为它们的数据库往往更加规范化等等。

  5. 最后,您可以在任何版本的Sybase中使用完全普通的SQL来提供FOJ的功能,并且在12.x上会明显更快;在15.x上仅略快一点。它有点像RANK()函数:如果你可以写一个子查询,那就很不必要了。

  6. 它不需要FULL OUTER的第二个原因,正如一些低端引擎所做的那样,是因为新的优化器非常快,并且查询完全正常化。 IE浏览器。它一次性执行LEFT和RIGHT。

  7. 根据您的SARG和DataType不匹配等情况,它可能仍然需要排序合并,但这也是所有三个级别的流式传输:磁盘I / O子系统;引擎);和网络处理程序。如果您的表是分区的,那么它还会在该级别进行并行化。

  8. 如果您的服务器未配置,您的结果集非常大,则可能需要增加proc cache sizenumber of sort buffers。就是这样。