我很困惑,因为空集也是一个集合,这是真的! 但是当我执行像
这样的查询时SELECT FirstName
,LastName
,EmailPromotion
FROM person.Person
ORDER BY LastName desc
OFFSET 0 ROW FETCH FIRST 0 ROW ONLY
它给出了一个错误 为 FETCH 子句提供的行数必须大于零。
同时,当我执行这样的查询时
DECLARE @n AS BIGINT = 0;
SELECT FirstName
,LastName
,EmailPromotion
FROM person.Person
ORDER BY LastName desc
OFFSET @n ROW FETCH FIRST @n ROW ONLY
又报错了 为 FETCH 子句提供的行数必须大于零。
但是当我执行这样的查询时,它不会给出任何错误并正确生成一个空集
DECLARE @n AS BIGINT = 0;
SELECT FirstName
,LastName
,EmailPromotion
FROM person.Person
ORDER BY LastName desc
OFFSET 0 ROW FETCH FIRST @n ROW ONLY
为什么有人可以解释一下这种行为?
最佳答案
SQL 存在许多问题,这些问题清楚地表明,虽然它受到基于集合的逻辑的启发,但它并不是严格基于集合的。这似乎是这里的情况,per the documentation ,对 FETCH
使用零值是不正确的。
SQL 在空集方面失败的其他示例包括不允许没有列的表(这在退化情况下可能很有趣)以及不允许声明没有列的键(其中表格应包含 0 行或恰好 1 行)1
因此,虽然我们可以说空集很很有趣,但这并不一定意味着 SQL 会帮助您生成它们。您发现的情况似乎确实允许这种情况发生,这似乎更像是“欺骗优化器”的情况,而不是您应该在生产代码中依赖的情况。
1IIRC,位于 The Third Manifesto Date 和 Darwen 将这些称为 SQL 的一些“无效”错误。其他基于集合的问题包括表和结果集允许有重复的行,因此可能是包而不是集合。
关于sql-server - 我正在使用 fetch 和 offset 运行查询,但对相同的行为感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43649841/