2010-04-11 39 views

回答

7

唯一加入你的类型真的需要的是LEFT OUTER JOIN。每个其他类型的连接都可以根据一个或多个左外连接重写,并且可能会进行一些筛选。那么为什么我们需要所有其他人?这只是为了混淆人们吗?如果只有一种类型的连接,会不会更简单?

您还可以问:为什么要同时使用a <= bb >= a?不要这些做同样的事情吗?我们不能摆脱其中之一吗?这将简化事情!

有时候将<=换成>=比替换交换参数更容易。同样,只有交换操作数时,左连接和右连接才是同样的事情。但是,再次选择这两个选项是实用的,而不是要求用户按特定顺序编写查询。

你可以要求另一件事是:在逻辑为什么我们ANDORNOTXORNANDNOR等?所有这些都可以根据NAND s来重写!为什么不只是有NAND?那么它的awkward根据NAND s写出OR,并且它的意图不是很明显 - 如果你写OR,人们立即知道你的意思。如果你写了一大堆NAND,你试图达到的目标并不明显。

同样,如果您想要做a FULL OUTER JOIN b您可以进行左连接和右连接,删除重复的结果,然后合并所有。但这是一个痛苦,所以它有一个速记。

你什么时候使用每一个?这是一个简化的规则:

  • 如果您总是希望左表中每行的结果行使用LEFT OUTER JOIN。
  • 如果您始终需要RIGHT表中每行的结果行,请使用RIGHT OUTER JOIN。
  • 如果您始终需要任一表中每行的结果行,请使用FULL OUTER JOIN。
  • 如果只在两个表中有一行时只需要结果行,请使用INNER JOIN。
  • 如果您想要所有可能的行对,每个表中有一行,请使用CROSS JOIN。
1

inner join - 从两套基于指定的条件匹配的联接行。

outer join - 选择一个集合中的所有集合,以及来自另一个集合的匹配或空(如果不匹配)元素。外连接可以是leftright,以指定哪个集合完整返回。

1

为了使其他答案更清晰 - 例如,当您加入的列包含空值时,您可以根据所选联接获得不同结果。

因此 - 对于每个真实场景都有一个适合它的连接(要么是没有数据的行,要么是空值示例中的连接)。

0

我的回答假设2个表连接上的一个键:

  • INNER JOIN - 得到的结果是在连接表(根据联接规则)
  • FULL OUTER JOIN - 得到的所有结果这两个表(笛卡尔乘积)
  • LEFT OUTER JOIN - 让所有来自左表的结果和匹配结果从右侧

您可以添加WHERE子句以进一步限制结果。

使用这些为了只得到你想要的得到。