问题描述
- 构建表:
CREATE TABLE test (id TEXT)
- 填充:
INSERT INTO test VALUES ('4711')
- 查询:
SELECT
id,'value','Value'
FROM
test
收益
id | Expr1001 | Expr1002 |
---|---|---|
4711 | 价值 | 价值 |
现在使用 disTINCT
的相同查询改变了第二个文字字符串的大小写:
SELECT disTINCT
id,'Value'
FROM
test
收益
id | Expr1001 | Expr1002 |
---|---|---|
4711 | 价值 | 价值 |
无论查询是通过 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 子句中没有“值”,解析为表达式
id | Expr1001 | Expr1002 |
---|---|---|
4711 | 价值 | 价值 |
SELECT
id,'Value'
FROM
test
GROUP BY
id,'valuE'
'value'
和 'valuE'
相等,因此 Expr1001 是一个组列 'valuE
,'Value'
也是如此
id | Expr1001 | Expr1002 |
---|---|---|
4711 | 价值 | 价值 |
使用了 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。