当我试图基于视图对数据建模时,我想到了这些查询。查询与以下示例类似。据我了解,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
答案 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。