当加入表的一个子集时,有什么理由偏好这些格式中的一种而不是另一种格式?
子查询版本:
SELECT ...
FROM Customers AS c
INNER JOIN (SELECT * FROM Classification WHERE CustomerType = 'Standard') AS cf
ON c.TypeCode = cf.Code
INNER JOIN SalesReps s ON cf.SalesRepID = s.SalesRepID
Run Code Online (Sandbox Code Playgroud)
vs最后的WHERE子句:
SELECT ...
FROM Customers AS c
INNER JOIN Classification AS cf ON c.TypeCode = cf.Code
INNER JOIN SalesReps AS s ON cf.SalesRepID = s.SalesRepID
WHERE cf.CustomerType = 'Standard'
Run Code Online (Sandbox Code Playgroud)
最后的WHERE子句感觉更"传统",但第一个可以说更清晰,特别是当连接变得越来越复杂时.
只有其他原因,我可以想到更喜欢第二个是第一个"SELECT*"可能会返回以后没有使用的列(在这种情况下,我可能只需要返回cf.Code和Cf. SalesRepID)
第三种选择呢?
SELECT ...
FROM Customers AS c
INNER JOIN Classification AS cf
ON cf.CustomerType = 'Standard'
AND c.TypeCode = cf.Code
INNER JOIN SalesReps AS s
ON cf.SalesRepID = s.SalesRepID
Run Code Online (Sandbox Code Playgroud)
就个人而言,我更喜欢使用JOIN语法来指示定义整个集合的语句,外键或其他条件,指示应该连接两行以在结果集中创建一行.
该WHERE子句包含筛选结果集的条件.可以说,当你执行一些连接时,这会变得非常臃肿和复杂,但是当你在集合中思考它遵循一种逻辑时:
SELECT 我想要什么专栏.JOIN 用于定义我想要从中获取行的集合的表.WHERE我的标准不符合的行.通过这种逻辑,我总是选择第二种语法以保持一致的可读性.