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)

2 番目の 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

FROMAccess では、複数の を含むクエリの句に括弧が必要JOINです。

その問題とは別に、その複合ON句 (2 つの句の最初のON句) を囲む別の括弧のペアも必要になると思います。

このテストされていない Access SQL は私には正しいように見えますが、可能であれば Access のクエリ デザイナーを使用して独自の SQL を作成する必要があると思います。デザイナーは、db エンジンを満足させる結合構文を認識しており、必要な括弧を自動的に追加します。

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は予約語であり、テーブル名またはエイリアスを前に付けることは、予約語が db エンジンを混乱させないようにするための 1 つの手法です。フィールド名を角括弧で囲むのは別の方法です。必要に応じて両方を組み合わせることもできます ... table_name.[reserved_word]... 「ベルトとサスペンダー」のアプローチ。

于 2013-04-28T14:15:19.973 に答える