2

vb.net 2010 express 中的以下代码会生成此错误:

查询表达式 '' 中的语法错误(缺少运算符)。

sql = "SELECT Machines.LocationID FROM Lanes LEFT JOIN Cabinets ON
Lanes.CabinetID=Cabinets.ID AND Cabinets.Name IS NOT NULL LEFT JOIN Machines ON
Cabinets.MachineID=Machines.ID "

Dim mAdapter As New OleDbDataAdapter(sql, con)
Dim mt As New DataTable("Results")
mAdapter.Fill(mt)

con在项目的一个模块中定义为:

Public myConString As String = "Provider=Microsoft.ACE.OLEDB.12.0"
Public databaseName As String = "C:\vending.mdb"
Public con As New OleDb.OleDbConnection(myConString & ";Data Source =" & databaseName)

如果我注释掉第二个 Left Join 命令,则该语句将正确执行。从 SQL Server 执行时,这条完全相同的 sql 语句可以正常工作。

表定义为:

地点

ID INTEGER IDENTITY
Company
Name
...

机器

ID INTEGER IDENTITY
LocationID Integer
Name as Text(100)
SerialNum as Text(100)
...

橱柜

ID INTEGER IDENTITY
Name TEXT(100)
MachineID INTEGER
...

车道

ID INTEGER IDENTITY
Name TEXT(100)
CabinetID INTEGER
...

如果我在连接语句周围添加括号,如下所示:

sql = "SELECT Machines.LocationID FROM ((Lanes LEFT JOIN Cabinets ON
Lanes.CabinetID=Cabinets.ID AND Cabinets.Name IS NOT NULL) LEFT JOIN Machines ON 
Cabinets.MachineID=Machines.ID) "

我得到错误:

不支持连接表达式。

请帮忙!

4

1 回答 1

3

对于FROM任何包含多个JOIN.

与该问题不同,我认为您还需要在该复合ON子句(两个ON子句中的第一个)周围加上另一对括号。

这个未经测试的 Access SQL 对我来说看起来是正确的,但我认为如果可能的话,你应该使用 Access 的查询设计器构建自己的。设计者知道让数据库引擎满意的连接语法,并会自动为您添加所需的括号。

SELECT Machines.LocationID
FROM
    (Lanes
    LEFT JOIN Cabinets
    ON (Lanes.CabinetID=Cabinets.ID AND Cabinets.Name IS NOT NULL))
    LEFT JOIN Machines
    ON Cabinets.MachineID=Machines.ID

Name是一个保留字,在它前面加上表名或别名是一种防止保留字混淆数据库引擎的技术。将字段名称括在方括号中是另一种方法。如果您愿意,您甚至可以将两者结合起来table_name.[reserved_word]……以实现“腰带和吊带”的方法。

于 2013-04-28T14:15:19.973 回答