【问题标题】:What does this SELECT statement do?这个 SELECT 语句有什么作用?
【发布时间】:2012-04-02 19:12:12
【问题描述】:

我正在查看一些代码,但遇到了一些我非常陌生的东西;谷歌的结果并没有证明是卓有成效的,所以我想知道是否有人可以解释以下代码的作用?它不引用我的任何表或数据库,所以我认为它是通用代码,我不需要提供我的数据库布局?非常感谢。

代码:

SELECT  ROW_NUMBER() OVER (ORDER BY Object_ID) AS weeks 
                FROM    SYS.OBJECTS 

【问题讨论】:

    标签: sql sql-server database select


    【解决方案1】:

    它将选择从 1 到 N 的数字,其中 N 是 sys.objects 中的行数。它不能保证排序顺序。

    假设 sys.objects 中至少有 52 行,此代码可能旨在提供所有周数(天哪!)。

    但是,此代码将返回超过 52 行,并且不能保证结果是有序的。我建议你摆脱这种肮脏。

    编辑:作为替代方案,我会选择创建下表:CREATE TABLE Weeks (WeekNumber TINYINT NOT NULL PrimaryKey) 并适当地填写它。这将比从 sys.objects 中选择更快,因为此自定义表将更小且排序正确。

    【讨论】:

    • 非常感谢您的回复。您能否建议一段与此等效的替代代码,但您可以在哪里设置行数?
    • 我添加了我的替代方案。作为奖励,您可以使用此表来存储每周的额外数据。
    • 感谢您的回复! :)
    【解决方案2】:

    开发人员正在使用系统表sysobjects 中的记录,通过使用ROW_NUMBER() 窗口函数并将列别名为“周”来获取序列号列表。 sys.objects 视图中的行数将根据定义到数据库的对象而变化,所以为什么有人会这样做是我无法理解的......

    如果需要一个简单的序列号列表,则有更多可预测的方法来获取它们。

    【讨论】:

    • 这些数字甚至不能保证是连续的。当有很多行时,并行计划将启动并扰乱排序。
    • 您可以确定 sysobjects 中有超过 53 个对象,因此您可以涵盖一年中的所有星期。是的,它们将按顺序编号,但可能未被选中。取决于 select 语句中的“order by”
    • 我应该放手,但是... @usr,您是说 ROW_NUMBER() OVER (任何主键字段)可能导致非唯一行号结果吗?我认为不会。
    • 这将产生唯一的行号,但它们的排序可能不是连续的。只有查询末尾的 order-by-clause 才能保证排序。 over 子句中的那个没有。例如,您可以在两个不同的子句中使用不同的排序。如果您仍然认为可以将此类代码投入生产,因为“它可以在我的机器上运行”,请不要靠近我的代码库 ;-)
    • @usr:如果您真的阅读了我的回答,您会清楚地看到我不会容忍这种生成周数的方法。感谢您的态度。
    猜你喜欢
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 2017-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多