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

Why does DISTINCT change case of literal string

我对 Access 数据库进行了以下简化查询:

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

产量

id Expr1001 Expr1002
4711 value Value

现在使用 DISTINCT 的相同查询更改了第二个文字字符串的大小写:

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

产量

id Expr1001 Expr1002
4711 value 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子句中没有'value',解析为表达式

id Expr1001 Expr1002
4711 value Value
SELECT
  id, 
  'value',
  'Value'
FROM 
  test
GROUP BY
  id, 'valuE'

'value''valuE'相等,所以Expr1001是组列'valuE'Value'

也一样
id Expr1001 Expr1002
4711 valuE valuE

使用 GROUP BY 子句中的字符串,即使两个字符串都不使用该大写。

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

如果我们将此行为与 T-SQL 进行比较,它不允许在 GROUP BY 部分使用常量,因此不会遇到此行为。 GROUP BY id, 'valuE' 无效 T-SQL.