SQL联接能否在联接之后而不是查询之后立即具有on子句?

时间:2019-01-10 19:53:15

标签: sql-server

当我试图基于视图对数据建模时,我想到了这些查询。查询与以下示例类似。据我了解,SQL联接后将跟随ON子句。在这里,连接不会紧跟在ON子句之后。当我运行这些视图时,它们可以在数据库上正常工作,并给出结果数据集。谁能解释这个查询?

Select *
FROM B  
INNER JOIN C     
INNER JOIN D  
ON C.c_id = D.d_id   
INNER JOIN E   
ON C.c_id = E.e_id  
INNER JOIN F   
ON E.e_id = F.f_id ON B.b_id = D.d_id 

3 个答案:

答案 0 :(得分:2)

是的,这是可能的。您可以使用括号使查询更清楚:

category |  num | series  |  title |  brand |
'CDs'       1     J12345   Rainbow   None 
'Styles'    2     J12345   Rainbow   None 
'Folk'      3     J12345   Rainbow   None 

如果您有兴趣,可以阅读有关various join strategies here的更多信息。将此特殊情况说明为第三个选项。

编辑:我应该注意,这可能不适用于所有数据库引擎,也找不到一种写查询的特别优雅的方法。尽管如此,它至少在某些情况下仍然有效。

答案 1 :(得分:1)

我在LEFT JOIN / INNER JOIN情况下通常使用这种模式。例如,设想一种情况,其中客户的地址是可选的,但是提供地址时,城市是必需的并且将永远存在。

SELECT c.CustomerName, ca.AddressLine1, cy.CityName
    FROM Customer c
        LEFT JOIN CustomerAddress ca
            INNER JOIN City cy
                ON ca.CityID = cy.CityID
            ON c.CustomerID = ca.CustomerID;

而且,正如其他人提到的那样,括号可以使意图更清楚。

SELECT c.CustomerName, ca.AddressLine1, cy.CityName
    FROM Customer c
        LEFT JOIN (CustomerAddress ca
            INNER JOIN City cy
                ON ca.CityID = cy.CityID)
            ON c.CustomerID = ca.CustomerID;

答案 2 :(得分:0)

是的,这是完全有效的语法...这是一个迹象,表明有人在SSMS中使用图形化查询设计器。

由于没有理智的人会像这样编写t-sql,因此至少可以确保99.9%是机器生成的t-sql。