1

我正在阅读Learning SQL 2nd Edition书。SET操作和. 之间有什么区别JOIN吗?是否有任何情况下您会选择SET操作离开JOIN

如果我错了,请纠正我,我们可以用JOIN我们能做的事情来做所有的事情SET

4

2 回答 2

3

集合操作UNIONINTERSECTEXCEPT。它们用于对具有相同模式的关系进行集合操作。例如:让R1R2成为以下模式:

R1 (A,B,C)
R2 (A,B,C)
  • R1 UNIONR2 = 和 中所有行的R1并集R2

  • R1 R2 =和INTERSECT中的公共行。R1R2

  • R1 R2 =中不存在的EXCEPT所有行。R1R2

请注意,我们对相同的模式关系使用集合操作,但我们可以对不同的模式关系使用连接操作,结果的模式是两个模式的并集。(通常我们使用连接操作来连接两个或多个表。)

于 2012-12-04T14:21:40.763 回答
1

不,你不能用 a 来做所有join你可以用 set 操作做的事情。但是,如果两个表具有相同的结构并且每个表都有唯一的标识符,那么您可以:

一个union将是:

select driver.id,
       coalesce(t1.col1, t2.col1) as col1,
       . . .  -- repeat this for all columns
from (select distinct coalesce(t1.id, t2.id) as id
      from ((select id
             from t1
            ) full outer join
            (select id
             from t2
            )
           )
     ) driver left outer join
     t1
     on t1.id = driver.id left outer join
     t2
     on t2.id = driver.id

exceptintersect可以以相同的方式接近,但将条件放在驱动full outer join程序表中。

实际上,您可以将此想法扩展为不需要唯一的 id,只需假设每个表中的行都是唯一的。在这种情况下,连接更加复杂,因为您必须包括所有列,并且还要考虑列中的 NULL 值。

也就是说,这些set操作有几个优点:

  1. 它们更具可读性。您和其他所有人可能会同意这一点,union并且union all比上述查询更具可读性。
  2. SQL 引擎理解集合操作,因此它们通常会更有效率。
  3. 在更复杂的 SQL 语句中很容易出现细微的错误,从而从根本上改变结果。例如,将上面驱动程序表中的“全外连接”更改为“内连接”就是 和 之间的union区别intersect
于 2012-12-04T14:36:56.860 回答