2011-10-21 15 views
58

Quando ho avuto un solo join interno nella mia istruzione SQL, ha funzionato perfettamente. Ho provato ad unire un secondo tavolo, e ora sto ricevendo un errore che dice che c'è un errore di sintassi (operatore mancante). Cosa c'è di sbagliato qui?Istruzione SQL multiplo join

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

-Display il comando select in una messagebox per vedere cosa succede. Penso che il tuo join potrebbe essere ok, e il problema è con le virgolette o qualcosa del genere. – MAW74656

+1

Se ricordo correttamente, la sintassi di accesso è racchiudendo ogni livello con parentesi quindi prova 'FROM [tableCourse] INNER JOIN [tableGrade] ON [tableCourse]. [Grading] = [tableGrade]. [Id] (INNER JOIN [tableCourseType] ON [tableCourse]. [Course_type] = [tableCourseType]. [Id]) ' – billinkc

risposta

125

Per multi-tavolo si unisce, è necessario nido l'extra si unisce tra parentesi:

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

fondamentalmente, per ogni tabella in più si partecipa oltre la prima, è necessaria una staffa prima della tabella originale 'FROM' e una parentesi di chiusura nella clausola JOIN 'on' corrispondente.

+9

Tale "funzione" non intuitiva per le persone abituate a * normale * SQL ... – qJake

+0

Questo era esattamente * quello che stavo cercando. Continuava a dirmi che alcuni sintassi o join non erano corretti quando funzionava perfettamente su SQL Management studio. – Paramone

22

L'accesso MS (in particolare Jet/ACE) richiede parentesi con più join. Prova:

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

" in particolare, il motore Jet db "- non vero: lo stesso vale per la versione del motore di Access Database Engine (ACE). – onedaywhen

+0

Il mio punto era che il requisito per le parentesi viene dal motore * db *, non * * *. Ma tu sei corretto, il requisito si applica anche a ACE/ADE/a prescindere da MS-is-calling-it-these-days. Ho aggiornato la mia risposta di conseguenza. – mwolfe02