gpt4 book ai didi

sql - 当可以按 1 排序时,为什么我不能按 1 排序?

转载 作者:行者123 更新时间:2023-12-03 23:46:56 24 4
gpt4 key购买 nike

为什么列序数对于 ORDER BY 是合法的但不适用于 GROUP BY ?也就是说,谁能告诉我为什么这个查询

SELECT OrgUnitID, COUNT(*) FROM Employee AS e GROUP BY OrgUnitID

不能写成
SELECT OrgUnitID, COUNT(*) FROM Employee AS e GROUP BY 1

当编写这样的查询完全合法时
SELECT OrgUnitID FROM Employee AS e ORDER BY 1

?

我真的想知道关系演算是否有一些微妙之处,或者会阻止分组正常工作的东西。

问题是,我的例子非常简单。通常我想要分组的列实际上是一个计算,并且必须在 GROUP BY 中重复完全相同的计算是 (a) 烦人和 (b) 在维护期间更容易出错。这是一个简单的例子:
SELECT DATEPART(YEAR,LastSeenOn), COUNT(*)
FROM Employee AS e
GROUP BY DATEPART(YEAR,LastSeenOn)

我认为 SQL 的规范化规则仅在数据库中表示一次数据也应该扩展到代码。我只想纠正该计算表达式一次(在 SELECT 列列表中),并且能够在 GROUP BY 中按序数引用它.

澄清:我专门研究 SQL Server 2008,但我仍然想知道一个整体的答案。

最佳答案

原因之一是因为 ORDER BY 是在 SQL Query 中运行的最后一件事,这里是操作顺序

  • FROM 子句
  • WHERE 条款
  • GROUP BY 子句
  • HAVING 条款
  • SELECT 子句
  • ORDER BY 条款

  • 因此,一旦您拥有 SELECT 子句中的列,您就可以使用序数定位

    编辑,根据评论添加了这个
    以这个为例
    create table test (a int, b int)
    insert test values(1,2)
    go

    下面的查询将解析没有问题,它不会运行
    select a as b, b as a
    from test
    order by 6

    这是错误

    消息 108,级别 16,状态 1,第 3 行
    ORDER BY 位置编号 6 超出了选择列表中项目数的范围。

    这也解析得很好
    select a as b, b as a
    from test
    group by 1

    但它因这个错误而爆炸

    消息 164,级别 15,状态 1,第 3 行
    每个 GROUP BY 表达式必须包含至少一列不是外部引用。

    关于sql - 当可以按 1 排序时,为什么我不能按 1 排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3630949/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com