SQL Server 2005 ROW_NUMBER() 不带 ORDER BY

2024-01-11

我正在尝试使用从一个表插入另一个表

DECLARE @IDOffset int;
SELECT @IDOffset = MAX(ISNULL(ID,0)) FROM TargetTable

INSERT INTO TargetTable(ID, FIELD)
SELECT [Increment] + @IDOffset ,FeildValue
FROM SourceTable
WHERE [somecondition]

TargetTable.ID 不是一个标识列,这就是为什么我必须自己找到一种自动递增它的方法。

我知道我可以使用游标,或者创建一个带有标识列和 FieldValue 字段的表变量,填充它,然后在我的insert into...select,但这效率不高。我尝试使用 ROW_NUMBER 函数来递增,但我确实在 SourceTable 中没有可以使用的合法 ORDER BY 字段,并且希望保留 SourceTable 的原始顺序(如果可能)。

任何人都可以提出任何建议吗?


您可以避免指定显式排序,如下所示:

INSERT dbo.TargetTable (ID, FIELD)
SELECT
   Row_Number() OVER (ORDER BY (SELECT 1))
      + Coalesce(
         (SELECT Max(ID) FROM dbo.TargetTable WITH (TABLOCKX, HOLDLOCK)),
         0
      ),
   FieldValue
FROM dbo.SourceTable
WHERE {somecondition};

但是,请注意,这只是避免指定顺序的一种方法,不保证任何原始数据顺序都将被保留。还有其他因素可能导致结果排序,例如ORDER BY在外部查询中。为了充分理解这一点,我们必须认识到“未排序(以特定方式)”的概念与“保留原始顺序”(以特定方式排序!)不同。我认为,从纯关系数据库的角度来看,后一个概念不存在, 根据定义(尽管可能有数据库实现违反了这一点,但 SQL Server 不是其中之一)。

计算的原因Max在查询中添加锁定提示是为了防止由于并发进程在查询执行部分之间使用您计划使用的相同值插入而导致错误。唯一的其他半合理的解决方法是在循环中执行 Max() 和 INSERT 多次,直到成功(距离理想的解决方案还很远)。使用标识列是远远优于。独占锁定整个表对并发性不利,这是轻描淡写的说法。

注:很多人用(SELECT NULL)绕过“窗口函数的 ORDER BY 子句中不允许使用常量”的限制。出于某种原因,我更喜欢1 over NULL。你用什么取决于你。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL Server 2005 ROW_NUMBER() 不带 ORDER BY 的相关文章

随机推荐

  • 为什么平均情况下插入排序是 θ(n^2) ?

    Insertion sort http en wikipedia org wiki Insertion sort has a runtime that is n when the input is sorted and O n2 when
  • Pandas 中分类变量的顺序

    我有一个 Pandas 数据框 如下所示 where a b c d是分类变量 使得a lt b lt c lt d and b gt 3 a c gt 2 b and d gt 1 5 c 如果给出了这些显式关系 如何将行与所有其他隐式关
  • 使用 br 从文本中查找 xpath

    我有这个html代码 div span test span foo br bar div 我试图用直接在 div 内的文本找到它 所以 foo bar 通常 我会去 div normalize space text foobar 但由于它不
  • 如何在 Python 中创建新的未知或动态/expando 对象

    在Python中 我们如何在没有预定义类的情况下创建一个新对象 然后动态地向它添加属性 例子 dynamic object Dynamic dynamic object dynamic property a abc dynamic obje
  • 如何针对特定文件关闭 ARC

    我知道我应该添加编译器标志 fno objc arc到 XCode 4 中的编译源来完成此操作 但它不起作用 即使添加了标志 我仍然遇到错误KeychainItemWrapper m文件声称我需要使用 bridge对于 C 指针 我的项目是
  • 如何通过 WMI 获取 IIS 应用程序信息

    如何使用 WMI 获取 IIS 应用程序 虚拟文件夹 的实际目录路径 Use 查看更多类似示例的工具 On Error Resume Next 常量 wbemFlagReturnImmediately h10 常量 wbemFlagForw
  • 如何限制信标的广告范围?

    是否可以限制信标的范围 以便只有在一定近距离 或接近度 内的设备才能识别并连接到信标 例如 0 5 米区域之外的设备不应该能够看到或连接到信标 我正在使用 iOS 设备作为信标 在苹果的CoreLocationAPI 有一个方法叫具有测量功
  • 如何在Elasticsearch数据库中创建唯一约束?

    我使用elasticsearch作为文档数据库 我创建的每条记录都有一个guid id 系统将其用作记录id 商务人士希望提供一项功能 让用户根据日期以及当天 本月迄今为止创建的记录数拥有自己的自动文件名约定 我需要的是防止重复的用户文件名
  • reg for . 中的双反斜杠和单斜杠有什么区别?

    下面两个命令 grep enrolments grep enrolments 得到了如下所示的相同结果 COMP4001 4368523 Doddau Yobhazravi 8684 M COMP9315 4368523 Doddau Yo
  • 使用“匿名”类实现 Delphi 接口

    我有一个界面 type IProgressObserver interface IInterface procedure ReportProgress Progress Integer procedure ReportError Messa
  • Java 模式匹配器:创建新的还是重置?

    假设一个正则表达式 通过 JavaMatcher对象 与大量字符串进行匹配 String expression The Regular Expression Pattern pattern Pattern compile expressio
  • 跨多个选项卡的工作表过滤脚本在主工作表上显示空白行,并导致其他脚本停止运行

    我有一个多方面的问题 我正在尝试编写一个脚本来提取选项卡名称 并使用该信息从每个单元格中提取特定单元格 文档的选项卡经常更改 以便创建主表 主表旨在显示所有打开的操作项目 并过滤掉任何关闭的项目 空白行 到目前为止 我的脚本可以工作 但它会
  • macOS:如何使用终端在启动后重定向进程的 STDERR / STDOUT?

    在 macOS 中 通常可以通过直接在终端中执行二进制文件来执行进程 从而获得一些可观的控制台 shell 输出 Applications SOME APPLICATION app Contents MacOS SOME APPLICATI
  • 使用 Capistrano 定义捆绑路径

    我在 capistrano 的 deploy rb 文件中使用以下配置 require bundler capistrano require rvm capistrano set bundle cmd home deployment rvm
  • git push 到远程分支

    我有一个有分支的远程项目 所以我首先克隆存储库 然后向克隆发出以下命令以在分支上工作 git checkout b
  • 使用 matplotlib 区分单击和双击

    我正在尝试捕获对我的人物的单击和双击 正如另一篇文章中所说answer https stackoverflow com a 17753195 4537483 the event包含event dblclick这是 False 或 True
  • 在Python中使用函数名作为变量

    我有一个有趣的 可能是愚蠢的 想法 如果我使用内置函数名称作为变量来分配某个对象 比如整数 会发生什么 这是我尝试过的 gt gt gt a 1 2 3 4 gt gt gt len a 4 gt gt gt len 1 gt gt gt
  • 以非交互方式将函数参数传递给 Julia

    我的文件中有一个 Julia 函数 假设是下面的 现在我想将参数传递给这个函数 我尝试做 julia filename jl randmatstat 5 但这给出了一个错误 即 标记是意外的 不确定解决方案是什么 我也对是否有一个 main
  • Socket.io 与 PubNub...为什么?

    我看到 PubNub 说他们支持 Socket io http blog pubnub com node js supercharged by pubnub socket io github http blog pubnub com nod
  • SQL Server 2005 ROW_NUMBER() 不带 ORDER BY

    我正在尝试使用从一个表插入另一个表 DECLARE IDOffset int SELECT IDOffset MAX ISNULL ID 0 FROM TargetTable INSERT INTO TargetTable ID FIELD