sql - Access 和 ODBC/Oracle 都能理解的通用 SQL

标签 sql oracle ms-access odbc query-optimization

我有一个基于链接的 ODBC 表 (Oracle) 的 MS Access 查询。

我正在此处解决查询性能不佳的问题:Access not properly translating TOP predicate to ODBC/Oracle SQL .

SELECT ri.*
FROM user1_road_insp AS ri
WHERE ri.insp_id = (
                    select 
                        top 1 ri2.insp_id   
                    from 
                        user1_road_insp ri2 
                    where 
                        ri2.road_id = ri.road_id 
                        and year(insp_date) between  [Enter a START year:] and [Enter a END year:]
                    order by 
                        ri2.insp_date desc, 
                        ri2.length desc,
                        ri2.insp_id
                   );

文档说:

When you spot a problem, you can try to resolve it by changing the local query. This is often difficult to do successfully, but you may be able to add criteria that are sent to the server, reducing the number of rows retrieved for local processing. In many cases you will find that, despite your best efforts, Office Access still retrieves some entire tables unnecessarily and performs final query processing locally.

但是,我突然意识到我并不真正理解应该编写哪种 SQL 才能使 Access 和 ODBC/Oracle 都满意。

我是否应该在本地查询中编写某种 Access 可以理解的通用 SQL,并且可以轻松转换为 ODBC/甲骨文SQL?通用 SQL 是真的吗?

最佳答案

ODBC 驱动程序使用哪种 SQL?这取决于 MS Access 通常具有三种类型的外部数据连接,每种连接都与不同的 SQL 方言与 ODBC API 进行交互。

  1. 链接表,其作用类似于本地表,但是 ODBC 连接的数据源,并且不存储在本地。一旦将它们合并到 Access 应用程序中,这些表就只能使用 MS Access 的 SQL 方言。它们可以与本地甚至其他来源的其他后端表连接。

    因此,为什么 TOP 在 MS Access 中可用,而在 Oracle 中不可用。您实质上是使用 Access SQL 来操作 Oracle 数据。 ODBC 充当数据源点,而 Access 的 Jet/ACE SQL 引擎则在缓存内存中进行处理和结果集查看。

    Linked Tables Ribbon Icon

  2. 传递查询,看不到本地表或本地应用环境中的任何其他内容。此类查询使用此处连接的数据库(即 Oracle)的 SQL 方言。

    因此,为什么TOP在Oracle中不可用并且列标识符中允许使用双引号。这种引用在 MS Access 中会失败。本质上,您正在使用 Oracle SQL 来操作 Access 应用程序中的 Oracle 数据。您可以获取 sqlout.txt 日志的输出,并在通过 ODBC 连接到 Oracle 数据库的直通查询中运行它。

    Pass Through Query Ribbon Icon

  3. ADO/DAO 记录集完全通过 VBA 等代码运行,直接连接到数据源并使用连接数据库的方言。

    在这里,您使用 Oracle SQL 通过 ODBC API 在 Access 应用程序中操作 Oracle 数据。

    ADO VBA Reference

在每一种类型中,您都必须连接到后端 ODBC 数据源。您甚至不需要使用 GUI,但可以使用 Access 的对象库来创建链接表(请参阅 DoCmd.TransferDatabase )并传递 querydef(请参阅 QueryDef.Connect.Execute )。

我怀疑您看到的 sqlout.txt 日志是 ODBC 调用对其 native 方言的翻译。

关于sql - Access 和 ODBC/Oracle 都能理解的通用 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46962563/

相关文章:

Access 中的 Sqlite 链接表再次给出 #deleted 值

php - 有一个 URL 标题来匹配 mysql 查询

sql - 带有 ALL 运算符的子查询

java - 我的插入语句有什么问题? mysql 的 java

database - odsi和odi的区别

ms-access - 为什么组合框向导选项 "Find a record on my form"并不总是可用?

mysql - 计算日期之间的差异

oracle - 为什么 sql plus 不包含我的带有 spool 的列中的所有数据

oracle - 使用 Oracle Streams AQ 在 Spring MDB 中共享 JMS 和 Hibernate 事务?

sql - 德尔福/Access 选择 SQL 错误