【问题标题】:SQL multiple join statementSQL 多重连接语句
【发布时间】:2011-12-12 21:19:10
【问题描述】:

当我的 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 & "'"

【问题讨论】:

  • - 在消息框中显示选择命令,看看会发生什么。我认为你的加入可能没问题,问题出在引号之类的。
  • 如果我没记错的话,访问语法让你用括号括住每一层,所以试试FROM [tableCourse] INNER JOIN [tableGrade] ON [tableCourse].[grading] = [tableGrade].[id] (INNER JOIN [tableCourseType] ON [tableCourse].[course_type] = [tableCourseType].[id])

标签: sql ms-access


【解决方案1】:

尽管有 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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • “特别是 Jet db 引擎”——不正确:这同样适用于引擎的 Access 数据库引擎 (ACE) 版本。
    • 我的意思是括号的要求来自 db engine,而不是 application。但你是对的,该要求也适用于 ACE/ADE/whatever-MS-is-calling-it-these-days。我相应地更新了我的答案。
    • 你不应该使用字符串连接来形成 SQL 语句和查询,而是使用参数。
    【解决方案3】:

    对于多表连接,您必须将额外的连接嵌套在括号中:

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

    基本上,对于您在第一个之后加入的每个额外表,您需要在原始 'FROM' 表之前使用一个括号,并在匹配的 JOIN 'on' 子句上使用一个右括号。

    【讨论】:

    • 正是我正在寻找的。当它可以在 SQL Management Studio 上完美运行时,它一直告诉我一些语法或连接不正确。
    猜你喜欢
    • 1970-01-01
    • 2016-03-15
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    • 2016-06-21
    相关资源
    最近更新 更多