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命令以查看出现的情况。我认为您的加入可能还不错,而问题出在引号之类。
2011年

1
如果我没FROM [tableCourse] INNER JOIN [tableGrade] ON [tableCourse].[grading] = [tableGrade].[id] (INNER JOIN [tableCourseType] ON [tableCourse].[course_type] = [tableCourseType].[id])
记错的

Answers:


166

对于多表联接,您必须将多余的联接嵌套在方括号中:

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

基本上,对于除第一个表之外的所有其他表,都需要在原始“ FROM”表之前加上一个括号,并在匹配的JOIN“ on”子句上使用一个结束括号。


正是我想要的。当它在SQL Management Studio上可以正常使用时,它一直告诉我某些语法或联接不正确。
Paramone

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)版本。
2011年

我的观点是,括号的要求来自db引擎,而不是应用程序。但是您是正确的,该要求也适用于这些天的ACE / ADE / MS。我相应地更新了我的答案。
mwolfe02 2011年

1
您永远不要使用字符串串联来形成SQL语句和查询,而应使用参数。

0

尽管有MS SQL Server,MS Access还是需要多个JOIN语句的括号。基本上,JOIN是两个表之间的操作。实际上,当您有多个JOIN时,您就是将前一个JOIN的结果联接到另一个表中。对于任何额外的JOIN,此逻辑都是级联的。例如,如果您在4个表之间进行JOIN操作,则需要如下编写:

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.