1
5
嗯,这是操作顺序……
可以重写为:
因此,基本上,首先根据连接条件,将t2与t3连接起来:table3_id=table2_id,然后在table2_id=table1_id上将t1与t2内部连接起来。 在第二个示例中,您首先使用t2将T1内部联接,然后在条件table2_id=table1_id下左联接结果与表t3内部联接。
可以重写为:
编辑 我道歉。我的第一句话是错的。这两个查询将产生相同的结果,但性能可能有所不同,因为在某些情况下,第一个查询的执行速度可能比第二个查询慢(当表1只包含表2中元素的一个子集时),因为将首先执行左联接,然后才与表1相交。与允许查询优化器执行其任务的第二个查询不同。 |
2
4
对于您的具体示例,我认为在生成的查询计划中不应该有任何差异,但是在可读性方面肯定有差异。第二个例子更容易理解。 如果您要反转示例中的连接类型,最终可能会得到许多不同的结果。
基于这样一个事实,连接的顺序在很多情况下都很重要——在编写连接语法时应该仔细考虑。如果您发现第二个示例正是您真正想要完成的,那么我将考虑重写查询,以便您能够更加强调联接的顺序…
|
3
2
查看这两个查询的不同之处的最佳方法是比较这两个查询的查询计划。 这些结果集没有区别 如果 对于表2中给定的行,表3中总是有行。 我在我的数据库中尝试过,但查询计划的不同之处在于 1。对于第一个查询,优化器选择首先对表2和表3进行联接。 2。对于第二个查询,优化器选择首先联接表1和表2。 |
4
0
如果您的DBMS优化器运行正常,那么您应该看到这两个查询之间完全没有区别。然而,即使是对于大型钢铁、高成本的平台,这也不是我有信心做出的假设,因此我对于发现查询计划(以及因此而产生的执行时间)的变化也相当没有信心。 |
sqlrobert · SQL-如何查找不包含特定字段值的一组记录 1 年前 |
Nick Fleetwood · 调度语法的LINQ查询 2 年前 |
Mateen Bagheri · 选择表的计数并选择其自身 2 年前 |
Java · 使用交叉应用同时显示两列 2 年前 |