Sql 向左连接条件添加严格的业务逻辑谓词

Sql 向左连接条件添加严格的业务逻辑谓词,sql,outer-join,Sql,Outer Join,这是理论/最佳实践征求意见 我已经习惯于将WHERE子句和连接条件视为“承载”任何业务逻辑的好地方,这将使我的查询尽可能精确 但我注意到,添加不相关的业务逻辑作为连接条件可能会违反“最佳实践”。例如: SELECT a.Id, b.Id FROM foo AS a LEFT OUTER JOIN bar AS b ON a.Id = b.Id AND GETDATE() >= "18/5/2011"

这是理论/最佳实践征求意见

我已经习惯于将WHERE子句和连接条件视为“承载”任何业务逻辑的好地方,这将使我的查询尽可能精确

但我注意到,添加不相关的业务逻辑作为连接条件可能会违反“最佳实践”。例如:

         SELECT a.Id, b.Id
           FROM foo AS a 
LEFT OUTER JOIN bar AS b ON a.Id = b.Id 
                        AND GETDATE() >= "18/5/2011"
这个例子有点幼稚:在现实生活中,调用方确实需要附加条件,如果没有附加条件,实际上会产生不真实的结果(调用方必须在代码中进行过滤)


注意,对于外部连接,当逻辑规定时,将条件放在WHERE子句中不是一个选项。

出于这个原因,我一直在实践中尽可能多地将条件放在
JOIN
语句中,并在许多地方读过,包括Joe Celko的著作,这是最好的做法

JOIN
条件会更快,因为它们会将行排除在一起添加到组合表中,在基于连接条件组合表之后使用
where
子句,并且可能会使用更大的数据集。在许多情况下,我确信优化器会智能地处理这一问题,并在可能的情况下应用于任何情况,但这只是猜测,最好是特定于引擎的