数据结构如下:
ID | Name | CID
---------------------------------
1 | x |
2 | a | 12
3 | a | 12
4 | c |
5 | x |
6 | [ |
当我执行普通查询时
SELECT DISTINCT Name FROM table WHERE ISNull(CID_ID) ORDER BY Name; [1]
SELECT DISTINCT Name FROM table ORDER BY Name; [2]
我在MySQL CLI中得到[1]的预期结果:
| Name
------------
| c
| x
| [
对于查询[2]:
| Name
------------
| a
| c
| x
| [
所以我的问题是:当我打开记录集并将其绑定到字段列表时,项目的顺序混乱了。具体而言,括号值为“[”的数据集位于MS-Access表单中字段列表的顶部,但仅当我执行查询[1]时。
我得到 NOT [1]的预期结果:
| Name
------------
| [
| c
| x
对于查询[2]:
| Name
------------
| a
| c
| x
| [
简化的VBA代码片段如下所示:
Dim dbs As DAO.Database
Dim rsSQL As DAO.Recordset
Dim strSQL As String
Set dbs = CurrentDb
strSQL = "SELECT DISTINCT Name FROM table WHERE ISNull(CID_ID) ORDER BY Name;"
Set rsSQL = dbs.OpenRecordset(strSQL, dbOpenSnapshot)
在我捕获记录集后,我覆盖了列表的记录集:
Set Me.ListNames.Recordset = oiManager.LoadDistinctName()
其他信息(1):
服务器版本:5.6.16 MySQL社区服务器(GPL)
其他信息(2):
| Name | Engine | Version | Collation
| ########## | InnoDB | 10 | utf8_general_ci
其他信息(3): 所以我在访问中创建了两个单独的查询并将其解雇。在数据表视图中,我得到“交换结果”:对于查询[1],它位于顶部,对于查询[2],括号位于底部。它是一个带有ODBC连接的链接MySQL表。我玩了一些表属性但没有效果。
然后我在访问中创建了一个虚拟表,在表中填充了一些值,结果是一致的:两个时间显示在顶部。因此,在我看来,不一致必须基于我使用链接MySQL表这一事实。
我正在使用:
答案 0 :(得分:1)
我能够重新创建你的结果。排序行为的变化似乎与使用IsNull()
函数有关。当我将查询[1]更改为
SELECT DISTINCT [Name] FROM [table] WHERE [CID_ID] IS NULL ORDER BY [Name];
然后查询[1]和查询[2]的排序是一致的(并且与MySQL查询相同)。
我的猜测是修改后的查询是“普通”SQL并直接传递给ODBC驱动程序,而原始IsNull()
查询需要ACE / Jet表达服务参与,因此最终的排序是Access通常用于查询本机ACE / Jet表的方式。