我有一个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

我将其理解为基于Table1Table2的joinid (Table1)action.id(Table2),在连接之后,仅考虑那些通过id(Table1)LEFT JOIN中有条目的行。
但我还是迷路了。接下来两个LEFT JOIN的意义是什么?
如何正确地将整个代码分解成子流程来理解执行流程?如果我的问题太琐碎,请道歉

最佳答案

您有一系列LEFT JOINs:

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条件不匹配。

07-26 00:39