1

我知道任何连接都可以通过 CROSS 连接和 WHERE 子句来完成。

我做了一些实验,看起来将相等谓词放在 where 子句中或作为内部连接的参数会产生相同的结果和相同的性能。

此外,使用内部连接不会节省任何输入,因为仍然必须指定连接谓词。

我想各种外连接也是如此。只需指定值可以为空或不为空。

我可以只使用交叉连接吗?

4

3 回答 3

10

不能使用 CROSS 连接和 WHERE 子句完成任何连接。交叉、内部和外部连接中的每一个都有其自身的逻辑意义。

  1. 交叉连接仅适用于一个阶段——笛卡尔积。
  2. 内连接应用两个阶段——笛卡尔积和过滤器。
  3. 外连接应用三个阶段——笛卡尔积、过滤器和添加外行。

包含 OUTER JOIN 子句的查询的一个令人困惑的方面是是否在 ON 过滤器或 WHERE 过滤器中指定逻辑表达式。两者的主要区别在于ON 是在添加外部行之前应用,而WHERE 是在之后应用。ON 过滤器从保留的表中删除一行(指定为左外或右外)不是最终的,因为它将被添加回来;相比之下,WHERE 过滤器对一行的消除是最终的。

ON 和 WHERE 子句之间的这种逻辑差异仅在使用外连接时存在。当您使用内部联接时,您在 ON 子句中使用内部联接表运算符或在 Where 子句中使用交叉联接表运算符指定逻辑表达式的位置并不重要。

希望这可以帮助!!!

于 2013-10-20T13:53:57.297 回答
1

答案是性能可能不会受到影响,但是,当您有经验丰富的开发人员查看交叉连接时,它们实际上是内部连接时,可读性和代码清晰度会受到阻碍。除此之外,这是个人喜好的问题。

于 2013-10-20T13:38:00.443 回答
0

你的问题对了一半。您说您测试并比较了JOINs 和 Dekart 的产品。你得到的结果是它们是相等的,但是大约一年前,我在 MySQL 数据库上进行了相同的测试,并且JOINs 更快。这是因为 SQL 标准指示必须如何执行连接操作,并且 Dekart 产品输出必须与INNER JOIN.

因此,由于某些原因,我的建议是使用标准方式编写查询:

  1. 在 DBMS(数据库管理系统)上运行良好的查询可能在另一个上运行不佳。
  2. 相同 DBMS 的先前版本可能无法像后者那样优化 Dekart 产品。
  3. 而且可能是最重要的。带有 s 的查询结构JOIN更容易阅读和理解它正在做的事情,因此更容易修改查询。

总而言之,我的建议是使用JOINs 代替。

于 2013-10-20T14:27:39.603 回答