Оператор множественного объединения 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
Другие вопросы по тегам