【发布时间】:2014-08-22 22:44:34
【问题描述】:
在 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 和所有人!
【问题讨论】:
-
on子句的位置控制逻辑连接顺序和参与连接的虚拟表。我懒得重写你冗长的查询,但你需要的所有信息都可以在这个答案的链接中找到。 stackoverflow.com/a/7312901/73226
标签: sql sql-server ms-access join