Оператор множественного объединения SQL
Когда в моем операторе SQL было только одно внутреннее соединение, оно работало идеально. Я попытался объединить вторую таблицу, и теперь я получаю сообщение об ошибке синтаксиса (отсутствует оператор). Что здесь не так?
adsFormView.SelectCommand = "SELECT * FROM [tableCourse] INNER JOIN [tableGrade] ON [tableCourse].[grading] = [tableGrade].[id] INNER JOIN [tableCourseType] ON [tableCourse].[course_type] = [tableCourseType].[id] WHERE [prefix]='" & myPrefix & "' AND [course_number]='" & myCourseNum & "'"
2 ответа
Для объединений с несколькими таблицами необходимо вложить дополнительные объединения в скобки:
SELECT ...
FROM ((origintable
JOIN jointable1 ON ...)
JOIN jointable2 ON ...)
JOIN jointable3 ON ...
в основном, для каждой дополнительной таблицы, к которой вы присоединяетесь после первой, вам нужна скобка перед исходной таблицей 'FROM' и закрывающая скобка в соответствующем предложении JOIN 'on'.
MS Access (в частности, Jet/ACE) требует скобок с несколькими объединениями. Пытаться:
adsFormView.SelectCommand = _
" SELECT * FROM ([tableCourse] " & _
" INNER JOIN [tableGrade] " & _
" ON [tableCourse].[grading] = [tableGrade].[id]) " & _
" INNER JOIN [tableCourseType] " & _
" ON [tableCourse].[course_type] = [tableCourseType].[id] " & _
" WHERE [prefix]='" & myPrefix & "'" & _
" AND [course_number]='" & myCourseNum & "'"
Несмотря на MS SQL Server, MS Access требует скобок для множественного оператора JOIN. По сути, JOIN - это операция между двумя таблицами. Когда у вас более одного JOIN, фактически, вы присоединяетесь к результату предыдущего JOIN к другой таблице. Эта логика каскадируется для любого дополнительного JOIN. Например, если у вас есть операции JOIN между 4 таблицами, вам нужно написать это следующим образом:
SELECT * FROM
(
( Table1 JOIN Table2 ON Table1.column1 = Table2.column2) --result of JOIN is treated as a temp table
JOIN Table3 ON Table1.column1 = Table3.column3
) --result of JOIN is treated as another temp table
JOIN Table4 ON Table4.column4 = Table2.column2