JOIN 操作中的语法错误

Syntax error in the JOIN operation

我有一个搜索按钮,可以在 4 个表中进行搜索。所以我用三个内部进行了 Sql 查询,并且我有复选框,所以如果选中复选框,它会将条件添加到查询中。但我有一个问题是:

System.Data.OleDb.OleDbException
Syntax error in the JOIN operation

    cmd = New OleDbCommand(Sql, myConnection)
    Dim da As OleDbDataAdapter

    Dim sql = "SELECT * from (tblDopages AS A INNER JOIN tblMatrice AS B on A.strMatrice = B.strMatrice) INNER JOIN (tblRefMatrice AS C on B.strMatrice = C.strMatrice) INNER JOIN (tblRefMatDetails AS D on C.intIDref = D.intIDRef) WHERE "

    If CKBrefech.Checked = True Then
        sql = sql & "strRefEch = '" & TBrefech.Text & "'  AND "
    End If
    If CKBmethode.Checked = True Then
        sql = sql & "strMethode = '" & CBmethode.Text & "' AND "
    End If
    If CKBpurif.Checked Then
        sql = sql & "strPurif = '" & CBpurif.Text & "' AND "
    End If
    If CKBmatrice.Checked Then
        sql = sql & "strMatrice = '" & CBmatrice.Text & "' AND "
    End If
    If CKBmol.Checked Then
        sql = sql & "strMolecule = '" & CBmol.Text & "' AND "
    End If
    If CKBechprep.Checked Then
        sql = sql & "datDatePrepa >= @DatPrepa AND "
        cmd.Parameters.Add("@DatPrepa", OleDbType.Date).Value = DTPechprep.Value.Date
    End If
    If CKBechau.Checked Then
        sql = sql & "datDatePrepa <= @Datau AND "
        cmd.Parameters.Add("@Datau", OleDbType.Date).Value = DTPechau.Value.Date
    End If
    If CKBtrigprepa.Checked = True Then
        sql = sql & "strTrigPrepa = '" & TBtrigprepa.Text & "' AND "
    End If
    If CKBtriganaly.Checked = True Then
        sql = sql & "strTrigAnaly = '" & TBtrigAnaly.Text & "' AND "
    End If
    If CKBappar.Checked = True Then
        sql = sql & "strNomTech = '" & CBappar.Text & "' AND "
    End If
    If CKBnumappar.Checked = True Then
        sql = sql & "[strEquip(Appareil)] = '" & CBnumappar.Text & "' AND "
    End If
    If CKBteneurmini.Checked = True Then
        sql = sql & "dblDopage >= " & TBteneurmini.Text & " AND "
    End If
    If CKBteneurmax.Checked = True Then
        sql = sql & "dblDopage <= " & TBteneurmax.Text & " AND "
    End If

    If GroupBox1.Enabled Then
        Try
            If CKBnomref.Checked Then
                sql = sql & "D.strReferentiel = '" & CBnomref.Text & "' AND "
            End If
            If CKBniv1.Checked Then
                sql = sql & "D.strNIveau1 = '" & CBniv1.Text & "' AND "
            End If
            If CKBniv2.Checked Then
                sql = sql & "D.strNiveau2 = '" & CBniv2.Text & "' AND "
            End If
            If CKBniv3.Checked Then
                sql = sql & "D.strNiveau3 = '" & CBniv3.Text & "' AND "
            End If
            If CKBniv4.Checked Then
                sql = sql & "D.strNiveau4 = '" & CBniv4.Text & "' AND "
            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End If
    If sql.EndsWith(" AND ") Then
        sql = sql.Substring(0, sql.Length - 4)
    End If
    ' Remove the WHERE if no textbox has been filled....'
    If sql.EndsWith(" WHERE ") Then
        sql = sql.Substring(0, sql.Length - 7)
    End If

    ' cmd = New OleDbCommand(sql, myConnection)
    cmd.CommandText = sql
    cmd.Connection = myConnection
    Dim MyDataSet As New DataSet
    da = New OleDbDataAdapter(sql, myConnection)
    da.SelectCommand = cmd

    da.SelectCommand.Parameters.Add(New OleDbParameter("@DatPrepa", DTPechprep.Value))  'adding date parameters to datatable
    da.SelectCommand.Parameters.Add(New OleDbParameter("@datau", DTPechprep.Value))     'adding date parameters to datatable
    'da.SelectCommand.Parameters.Add(New OleDbParameter("@Matrice", matrice.ToString))     'adding Matrice parameters to datatable

    da.Fill(MyDataSet, "Matrice")
    DataGridView1.DataSource = MyDataSet.Tables("Matrice")

    'to focus on first row of DGV after populating it 
    DataGridView1.Rows(0).Selected = True

    LBnumresult.Text = DataGridView1.RowCount - 1

嗯,你有一些语法错误。改变这个:

SELECT * 
FROM (tblDopages AS A 
INNER JOIN tblMatrice AS B ON A.strMatrice = B.strMatrice) 
INNER JOIN (tblRefMatrice AS C ON B.strMatrice = C.strMatrice) 
INNER JOIN (tblRefMatDetails AS D ON C.intIDref = D.intIDRef) 
WHERE strMethode = 'MarMeth1' AND strPurif = 'MarPurif2'

对此:

SELECT * 
FROM ((tblDopages AS A 
INNER JOIN tblMatrice AS B ON A.strMatrice = B.strMatrice) 
INNER JOIN tblRefMatrice AS C ON B.strMatrice = C.strMatrice) 
INNER JOIN tblRefMatDetails AS D ON C.intIDref = D.intIDRef
WHERE strMethode = 'MarMeth1' AND strPurif = 'MarPurif2'

一般:

SELECT ...
FROM ((--here N-2 parentesis
     table1
JOIN table2 ON ...)
JOIN table3 ON ...)
JOIN table4 ON ...)
JOIN tableN ON ...--here no parentesis

这是我使用的答案,其中包含 3 个表之间的 2 个内部连接和左连接。 我先做了内连接,最后做了左连接

昏暗 sql = "SELECT distinct A.* FROM ((tblMatrice AS B INNER JOIN tblRefMatrice AS C ON B.strMatrice = C.strMatrice) INNER JOIN tblRefMatDetails AS D ON C.intIDref = D.intIDRef) LEFT OUTER JOIN tblDopages AS A on A.strMatrice = B.strMatrice where "