我有一个sql查询,如下所示
select *
FROM Table1
LEFT JOIN Table2
ON Table1.id =
Table2.action_id
LEFT JOIN Table3
ON Table1.changeset_id =
Table3.id
LEFT JOIN Table4
ON Table2.field_id =
table4.id
我寻求帮助,以了解在完成此代码后将发生什么。我明白第一部分。
select *
FROM Table1
LEFT JOIN Table2
ON Table1.id =
Table2.action_id
我将其理解为基于
Table1
和Table2
的joinid (Table1)
和action.id(Table2)
,在连接之后,仅考虑那些通过id(Table1)
在LEFT JOIN
中有条目的行。但我还是迷路了。接下来两个
LEFT JOIN
的意义是什么?如何正确地将整个代码分解成子流程来理解执行流程?如果我的问题太琐碎,请道歉
最佳答案
您有一系列LEFT JOIN
s:
FROM Table1 LEFT JOIN
Table2
ON Table1.id = Table2.action_id LEFT JOIN
Table3
ON Table1.changeset_id = Table3.id LEFT JOIN
Table4
ON Table2.field_id = table4.id
这样做的目的是将所有行保持在
Table1
中,而不考虑后续表中的匹配项。哪些行匹配,然后遵循
ON
条件。如果它们只引用第一个表和给定的表,那么这很简单。在您的例子中,它们也指中间表。所以:
对于
Table2
可以为所有匹配Table1
的行获取列。对于
Table3
可以为所有匹配Table1
的行获取列。对于
Table4
,您将获得Table4
中与Table2
中与Table1
中的行匹配的所有行的列。我发现这是一个有点复杂的解释,而不是理解。关键是
NULL
值(在外部联接中丢失的值)与ON
条件不匹配。