![]() |
1
3
是的,这是获得内部联接的一种迂回方式。 想想它是如何工作的:它从A中提取所有内容,然后是匹配的B或null,然后是所有G(A/B和G侧的null),然后它基本上过滤掉所有有null侧的内容(WHERE子句)。所以,是的,内部连接可能更快。 这种混淆的一个常见原因是:
相当于:
但是,这种相同的传递方法不适用于完整/外部联接,因为它将进行联接,然后进行过滤(当然,这取决于过滤器和优化器)。 因此,简而言之:如果您确实想要内部联接,请使用内部联接。 编辑:我还应该注意,这不是PK/FK交易,而是如果您在WHERE子句中基本上重复ON子句,则完整/外部联接将等效于内部联接。 |
![]() |
2
1
是的,您也可以简单地添加
这也会从连接的“外部”过滤掉“额外”记录。。。 |
![]() |
3
1
是,如果在where子句中引用了除“where myfield为null”之外的任何内容的左外部联接的右侧,则已创建内部联接。这是因为它会过滤掉任何不符合该条件的内容,包括所有与初始表不匹配的记录。与其他非内部联接相同。为了绕过它,你把条件放在连接中。示例(这会将其转换为内部联接):
“从(A.id=B.A_id)、C、D、F上的内部联接B中选择…,其中A.id=F.id” to:“从上的内部联接B(A.id=B.A\U id)中选择…A.id=F.A\U id上的内部联接F” 您不希望像这样组合语法;这变得很难维持。事实上,我建议永远不要使用老式的逗号语法,因为它会受到意外交叉连接的影响。因此,在您的示例中,我将编写以获取您当前获得的结果集(至少维护人员会知道您取消了交叉连接,而不是意外地进行交叉连接):
或者,如果交叉连接是偶然的,则代码将更改为:
|
![]() |
Community wiki · SQL语法新手 1 年前 |
![]() |
KateMak · 是否将多行中的多列与唯一id组合? 1 年前 |
![]() |
Karuna · SQL中列内的筛选器[重复] 1 年前 |
![]() |
Irvan Affandy · 为另一个选择选择声明的键 1 年前 |
![]() |
Community wiki · 这个MySQL语句出了什么问题? 1 年前 |
![]() |
Community wiki · 优化从同一表中提取的多列的查询 1 年前 |