上周,我惊讶地发现,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子句加入选择。

  1. 首先,我不知道你为什么使用的12.x.它是 EndOfLifed 在31日2009年,在已经被通知在3月,2007年。15.0.2(第一固版本)中出来在月2009年。15.5是更好的和可02Dec.2009年,所以你是两个主要发布,并在至少13个月,出的日期。

  2. ASE12.5.4有新加入的语法。(你还没有指定,则可以在12.5.0.3,释放之前到那)。

  3. DB2and Sybase没有实现 FULL OUTER JOIN, 为精确的因为你已经确定:它是由 LEFT ... UNION ... RIGHT 没有 ALL.它不是一个情况下"不支持"一个FOJ;这是一个案例的关键词是失踪。

  4. 然后你有问题Sybase和DB2类型一般会从来没有使用外加入让我们单独FOJs,因为它们的数据库的数据往往更加正规化,等等。

  5. 最后,有的是完美的普通SQL可以使用的任何版本的Sybase,将供应功能的FOJ,并将明显快于12.x;只稍微快在15.x.它是一种喜欢的排名()function:相当不必要的,如果你可以写一个子查询。

  6. 第二个原因它不需要 FULL OUTER, 一些低端发动机这样做,是因为新的优化非常快,和查询是完全正常.Ie。它执行左右在一个单一的通过。

  7. 取决于你Sarg和数据类型的不匹配,等等,它仍可能需要排序合并,但也是传输,在所有三个层次:磁盘I/O子系统;发动机(s);和网络的处理程序。如果你的表均分配,然后是另外并行在这一水平。

  8. 如果你不配置服务器 你的结果设定是非常大的,可能需要增加 proc cache sizenumber of sort buffers.这就是全部。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top