我对 Access 数据库有以下简化查询:
- 构建表:
CREATE TABLE test (id TEXT)
- 填充:
INSERT INTO test VALUES ('4711')
- 查询:
SELECT
id,
'value',
'Value'
FROM
test
产量
现在与 DISTINCT
进行相同的查询更改第二个文字字符串的大小写:
SELECT DISTINCT
id,
'value',
'Value'
FROM
test
产量
无论查询是通过 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 子句中没有“值”,解析为表达式
SELECT
id,
'value',
'Value'
FROM
test
GROUP BY
id, 'valuE'
'value'
和'valuE'
相等,因此 Expr1001 是组列 '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/