如何通过OleDb在MS Access上使用公用表表达式执行复杂的SQL查询

Thu*_*nga 2 sql database vb.net ms-access oledbdataadapter

我在使用VB.NET执行复杂的SQL查询时遇到问题OledbDataAdapter.这个Sql查询在W3school的SQL Tryit编辑器中工作正常.以下是我现有的VB.NET代码,有没有办法直接在VB.NET中执行那种SQL查询,或者任何人都可以更改此查询以使用VB.NET同样的结果?

    Dim con As New OleDb.OleDbConnection
    Dim dbProvider As String
    Dim dbSource As String
    Dim ds As New DataSet
    Dim da As OleDb.OleDbDataAdapter
    Dim sql As String

    dbProvider = "PROVIDER=Microsoft.Jet.OLEDB.4.0;"
    dbSource = "Data Source = C:\database.mdb"
    con.ConnectionString = dbProvider & dbSource
    con.Open()
    sql = "With query1 as (SELECT Val,DateAndTime FROM [FloatTable] where TagIndex='0') " _
        ",Query2 as (SELECT Val,DateAndTime FROM [FloatTable] where TagIndex='1') " _
        "select query1.val as 'TT348',Query2.val as 'TT358',Query2.DateAndTime as 'DateAndTime' " _
        "From query1,Query2 "_
        "where query1.DateAndTime=Query2.DateAndTime"
    da = New OleDb.OleDbDataAdapter(sql, con)

    da.Fill(ds, "Log")
    con.Close()

    DataGridView1.DataSource = ds
Run Code Online (Sandbox Code Playgroud)

当我运行此代码片段时,它会给出错误消息

无效的SQL语句; 预期'DELETE','INSERT','PROCEDURE','SELECT'或'UPDATE'.

非常感谢任何帮助,谢谢......

Stu*_*tLC 7

除了Peter在Access中缺乏CTE支持之外,由于引用的CTE都没有使用递归等高级功能,因此您可以轻松地将CTE更改为具有相同别名的Derived Tables,并保留原始查询的流程.此外,更好的做法是使用a JOIN来连接表,而不是WHERE子句.它很简单:

SELECT query1.val as 'TT348',Query2.val as 'TT358',Query2.DateAndTime as 'DateAndTime' 
 FROM 
 (SELECT Val,DateAndTime FROM [FloatTable] where TagIndex='0') AS query1
 INNER JOIN
 (SELECT Val,DateAndTime FROM [FloatTable] where TagIndex='1') AS Query2 
 ON query1.DateAndTime=Query2.DateAndTime;
Run Code Online (Sandbox Code Playgroud)


Pet*_*der 5

问题是Access数据库无法处理公用表表达式(CTE)查询.使用SQL Server或尝试更改您的查询.