ms-access - 为什么 DISTINCT 改变文字字符串的大小写

标签 ms-access oledb jet

我对 Access 数据库有以下简化查询:

  • 构建表:CREATE TABLE test (id TEXT)
  • 填充:INSERT INTO test VALUES ('4711')
  • 查询:
SELECT
  id, 
  'value',
  'Value'
FROM 
  test

产量

<表类=“s-表”> <标题> id Expr1001 Expr1002 <正文> 4711 值 值(value)

现在与 DISTINCT 进行相同的查询更改第二个文字字符串的大小写:

SELECT DISTINCT
  id, 
  'value',
  'Value'
FROM 
  test

产量

<表类=“s-表”> <标题> id Expr1001 Expr1002 <正文> 4711 值 值(value)

无论查询是通过 OleDb 还是直接通过 MS Access,结果都是相同的。数据库引擎为什么会改变文字值?我知道 jet sql 有时很奇怪 - 但这在我看来像是一个错误。或者这种行为是否在某处描述过?

最佳答案

这主要是猜测,但我认为正在发生的事情如下:

SELECT DISTINCT x等于SELECT x GROUP BY x并转换为它。

GROUP BY 中的列已进行重复数据删除,'value'等于'Value'根据排序规则,因此仅处理第一次出现的情况。

对于每一列,它可以是常量(计算一次)、聚合列(为每个组计算)或组列。自 'value'位于 GROUP BY'Value'等于'value' ,它们都映射到组 'value'

当按各个列分组时,我们也可以看到这种行为:

SELECT
  id, 
  'value',
  'Value'
FROM 
  test
GROUP BY
  id

GROUP BY 子句中没有“值”,解析为表达式

<表类=“s-表”> <标题> id Expr1001 Expr1002 <正文> 4711 值 值(value)
SELECT
  id, 
  'value',
  'Value'
FROM 
  test
GROUP BY
  id, 'valuE'

'value''valuE'相等,因此 Expr1001 是组列 'valuE ,同样适用于 'Value'

<表类=“s-表”> <标题> id Expr1001 Expr1002 <正文> 4711 值(value) 值(value)

来自 GROUP BY 的字符串使用子句,即使两个字符串都没有使用该大写。

但是,据我所知,这种行为没有记录在案。据记载,在评估组时,大小写被忽略,例如你可以做SELECT ID, MAX(SomeColumn) FROM MyTable GROUP BY id Access 不会提示没有 ID GROUP BY 中的列子句,但奇怪的是这适用于常量和 DISTINCT以及。明显的解决方法是:不要按常量分组,使用 GROUP BY而不是DISTINCT当你有 SELECT带有常量的子句。

如果我们将此行为与 T-SQL 进行比较,它不允许 GROUP BY 中存在常量。部分,因此不会经历这种行为。 GROUP BY id, 'valuE'不是有效的 T-SQL。

关于ms-access - 为什么 DISTINCT 改变文字字符串的大小写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65683843/

相关文章:

c# - 在 C# 中使用 oledb 更新数据

sql - 如何在带有数字字段的 SQL 中使用 LIKE 条件?

asp.net - 如何在查询中将拆分字符串函数与 OLEDB.Jet 用于 Excel 文件

c# - 处理大型数据库的最佳方式?

tsql - 如何解决 OLE DB 提供程序 "Could not find installable ISAM."的 "Microsoft.ACE.OLEDB.12.0"错误

sql-server-2008 - 将 Access 应用程序连接到不同服务器中的 SQL Server 的可能方法?

excel - 将 xls 读取为数据库时确定 Excel 文件的第一个工作表名称

java - 如何在 Eclipse Jet 中生成代码时抛出异常?

ms-access - 创建新记录时的 MS Access 事件

sql - 是什么原因导致 “Syntax error in INSERT INTO statement”