In SSMS 2012 I'm looking at a large view created in MS Access. When I script the view to a query window the FROM clause looks like this:
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)
When I format the clause so the JOIN's and ON's are on separate lines, it looks like this:
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)
Many of the JOINs do not have ON statements, yet the view compiles and returns data without errors. What does a RIGHT OUTER JOIN without an ON clause mean -- is it a Cartesian join?
UPDATE: Based on this question -- Wierd SQL Server view definition -- and its links, we cannot simply rearrange the JOINs/ONs to more sane order -- the order affects the logic of the retrieval. I'm just going to rewrite this query with easier-to-understand logic. Thanks to @MartinSmith and all!