Оператор множинного приєднання SQL


76

Коли у моєму операторі 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 & "'"

-Відобразіть команду select у вікні повідомлень, щоб побачити, що з’явиться. Я думаю, що ваше приєднання може бути нормальним, і проблема полягає в лапках або щось інше.
MAW74656,

1
Якщо я правильно пам'ятаю, синтаксис доступу передбачає, що ви закриваєте кожен шар дужками, тому спробуйтеFROM [tableCourse] INNER JOIN [tableGrade] ON [tableCourse].[grading] = [tableGrade].[id] (INNER JOIN [tableCourseType] ON [tableCourse].[course_type] = [tableCourseType].[id])
billinkc

Відповіді:


169

Для об’єднань із декількома таблицями додаткові об’єднання потрібно вкласти в дужки:

SELECT ...
FROM ((origintable
JOIN jointable1 ON ...)
JOIN jointable2 ON ...)
JOIN jointable3 ON ...

по суті, для кожної додаткової таблиці, до якої ви приєднуєтеся першою, вам потрібна дужка перед початковою таблицею «ВІД» і закриваюча дужка для відповідного речення JOIN «on».


Це було саме те , що я шукав. Він постійно говорив мені, що якийсь синтаксис або приєднання є неправильним, коли він буде прекрасно працювати в студії SQL Management.
Парамон

23

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 & "'"

1
"зокрема, движок Jet db" - не відповідає дійсності: те саме стосується версії движка Access Database Engine (ACE).
onedaywhen

Моя точка зору в тому , що потреба в дужках походить від дб двигуна , а НЕ додатки . Але ви маєте рацію, вимога стосується також ACE / ADE / все-що-MS-викликає-це-сьогодні. Відповідно оновив свою відповідь.
mwolfe02

1
Ніколи не слід використовувати конкатенацію рядків для формування операторів та запитів SQL, замість цього використовуйте параметри.
Dai

1

Незважаючи на MS SQL Server, MS Access вимагає дужок для декількох операторів 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.