SQL Multiple Join-Anweisung


76

Wenn ich nur einen inneren Join in meiner SQL-Anweisung hatte, funktionierte es perfekt. Ich habe versucht, einer zweiten Tabelle beizutreten, und jetzt wird ein Fehler angezeigt, der besagt, dass ein Syntaxfehler vorliegt (fehlender Operator). Was ist hier falsch?

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

- Zeigen Sie den Befehl select in einer Nachrichtenbox an, um zu sehen, was angezeigt wird. Ich denke, Ihr Join ist möglicherweise in Ordnung, und das Problem liegt in Anführungszeichen oder Ähnlichem.
MAW74656

1
Wenn ich mich richtig erinnere, haben Sie bei der Zugriffssyntax jede Ebene in Klammern eingeschlossen. Versuchen Sie es alsoFROM [tableCourse] INNER JOIN [tableGrade] ON [tableCourse].[grading] = [tableGrade].[id] (INNER JOIN [tableCourseType] ON [tableCourse].[course_type] = [tableCourseType].[id])
billinkc

Antworten:


166

Bei Verknüpfungen mit mehreren Tabellen müssen Sie die zusätzlichen Verknüpfungen in Klammern verschachteln:

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

Grundsätzlich benötigen Sie für jede zusätzliche Tabelle, der Sie nach der ersten beitreten, eine Klammer vor der ursprünglichen 'FROM'-Tabelle und eine schließende Klammer in der passenden JOIN' on'-Klausel.


Das war genau das, was ich suchte. Es wurde mir immer wieder gesagt, dass eine Syntax oder ein Join falsch war, wenn es unter SQL Management Studio perfekt funktionieren würde.
Paramone

23

MS Access (insbesondere Jet / ACE) erfordert Klammern mit mehreren Verknüpfungen. Versuchen:

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
"Speziell die Jet-DB-Engine" - nicht wahr: Gleiches gilt für die Access Database Engine (ACE) -Version der Engine.
Tag, wenn

Mein Punkt war, dass die Anforderung für Klammern von der DB- Engine kommt , nicht von der Anwendung . Aber Sie haben Recht, die Anforderung gilt auch für ACE / ADE / was auch immer-MS-nennt-es heutzutage. Ich habe meine Antwort entsprechend aktualisiert.
mwolfe02

1
Sie sollten niemals die Verkettung von Zeichenfolgen verwenden, um SQL-Anweisungen und -Abfragen zu erstellen. Verwenden Sie stattdessen Parameter.
Dai

0

Trotz MS SQL Server benötigt MS Access Klammern für eine Mehrfach-JOIN-Anweisung. Grundsätzlich ist JOIN eine Operation zwischen zwei Tabellen. Wenn Sie mehr als einen JOIN haben, verbinden Sie das Ergebnis des vorherigen JOIN tatsächlich mit einer anderen Tabelle. Diese Logik wird für jeden zusätzlichen JOIN kaskadiert. Wenn Sie beispielsweise JOIN-Operationen zwischen 4 Tabellen haben, müssen Sie diese wie folgt schreiben:

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.