为什么 DISTINCT 改变文字字符串的大小写
Why does DISTINCT change case of literal string
我对 Access 数据库进行了以下简化查询:
- 构建 table:
CREATE TABLE test (id TEXT)
- 填充:
INSERT INTO test VALUES ('4711')
- 查询:
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.
我对 Access 数据库进行了以下简化查询:
- 构建 table:
CREATE TABLE test (id TEXT)
- 填充:
INSERT INTO test VALUES ('4711')
- 查询:
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.