View的ON子句不会按JOIN顺序出现

时间:2014-08-22 22:44:35

标签: sql sql-server ms-access join

在SSMS 2012中,我正在查看在MS Access中创建的大视图。当我将视图编写到查询窗口时,FROM子句如下所示:

FROM         dbo.oa_projecttask_type RIGHT OUTER JOIN
    dbo.oa_project_task RIGHT OUTER JOIN
    dbo.[Functional Area] RIGHT OUTER JOIN
    dbo.oa_category ON dbo.[Functional Area].[Product Code] = dbo.oa_category.name RIGHT OUTER JOIN
    dbo.oa_project RIGHT OUTER JOIN
    dbo.vw_People_All_Ever RIGHT OUTER JOIN
    dbo.oa_task ON dbo.vw_People_All_Ever.[User ID] = dbo.oa_task.user_id ON dbo.oa_project.id = dbo.oa_task.project_id ON 
    dbo.oa_category.id = dbo.oa_task.category_id ON dbo.oa_project_task.id = dbo.oa_task.project_task_id ON 
    dbo.oa_projecttask_type.id = dbo.oa_task.projecttask_type_id LEFT OUTER JOIN
    dbo.upl_approval_status RIGHT OUTER JOIN
    dbo.oa_timesheet ON dbo.upl_approval_status.Code = dbo.oa_timesheet.status ON dbo.oa_task.timesheet_id = dbo.oa_timesheet.id
WHERE     (CONVERT(datetime, oa_task.created) > GETDATE() - 366) AND (oa_task.deleted IS NULL)

当我格式化子句以使JOIN和ON位于不同的行时,它看起来像这样:

FROM oa_projecttask_type 
   RIGHT OUTER JOIN oa_project_task 
   RIGHT OUTER JOIN [Functional Area] 
   RIGHT OUTER JOIN oa_category 
      ON [Functional Area].[Product Code] = oa_category.name 
   RIGHT OUTER JOIN oa_project 
   RIGHT OUTER JOIN vw_People_All_Ever 
   RIGHT OUTER JOIN oa_task 
      ON vw_People_All_Ever.[User ID] = oa_task.user_id 
      ON oa_project.id = oa_task.project_id 
      ON oa_category.id = oa_task.category_id 
      ON oa_project_task.id = oa_task.project_task_id 
      ON oa_projecttask_type.id = oa_task.projecttask_type_id 
   LEFT OUTER JOIN upl_approval_status 
   RIGHT OUTER JOIN oa_timesheet 
      ON upl_approval_status.Code = oa_timesheet.status 
      ON oa_task.timesheet_id = oa_timesheet.id
WHERE     (CONVERT(datetime, oa_task.created) > GETDATE() - 366) AND (oa_task.deleted IS NULL)

许多JOIN没有ON语句,但视图编译并返回数据而没有错误。没有ON子句的RIGHT OUTER JOIN是什么意思 - 它是笛卡尔连接吗?

更新:基于这个问题 - Wierd SQL Server view definition - 及其链接,我们不能简单地将JOIN / ON重新排列为更合理的顺序 - 顺序会影响检索的逻辑。我只是用更容易理解的逻辑重写这个查询。感谢@MartinSmith和所有人!

1 个答案:

答案 0 :(得分:1)

如果你仔细检查,你会看到每个Right Outer Join都有他的ON语句,而不是在那个地方 我想所有joins都会找到自己的ON s ON语句,RIGHT/LEFT Outer Join需要{{1}}才能正常工作。

有关此主题的更多信息,您可以在评论中找到HERE Martin Smith