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

How to execute complex SQL queries using Common Table Expressions on MS Access via OleDb

我在 VB.NET 中使用 OledbDataAdapter 执行复杂的 SQL 查询时遇到问题。此 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

当我 运行 这个代码片段时,它给出了一个错误告诉

Invalid SQL statement; expected 'DELETE', 'INSERT', 'PROCEDURE', 'SELECT', or 'UPDATE'.

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

问题是 Access 数据库无法处理通用 Table 表达式 (CTE) 查询。使用 SQL 服务器或尝试更改您的查询。

除了 Peter 指出 Access 中缺少 CTE 支持之外,由于引用的 CTE 都不使用递归等高级功能,因此您可以轻松地将 CTE 更改为具有相同别名的派生表,并保留原始查询。此外,使用 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;