使用 UNION INSERT INTO SELECT 奇怪的顺序

2024-01-11

我有一个典型的非标准化表(tempTable)具有多个编号的列(rep1,rep2,...)。 所以我编写了一个脚本将非标准化数据插入到标准化表中(myTable):

insert into myTable
select idRep,rep FROM
(
    select idRep, ISNULL(rep1,'') as rep FROM tempTable
    union
    select idRep, ISNULL(rep2,'') as rep FROM tempTable
    union
    select idRep, ISNULL(rep3,'') as rep FROM tempTable
    union
    select idRep, ISNULL(rep4,'') as rep FROM tempTable
    union
    select idRep, ISNULL(rep5,'') as rep FROM tempTable
) as t

注:表myTable还包含一个自动递增的IDENTITY列作为其PRIMARY KEY.

在我的场景中,rep1、rep2、rep3、rep4、rep5 的顺序很重要。奇怪的是,当我执行脚本时,数据没有按正确的顺序插入,例如自动生成的 id '1000' 具有来自 'rep3' 的值,而 id '1001' 具有来自 'rep1' 的值。

这是为什么?脚本是如何执行的?


使用 UNION 时它没有按照您期望的顺序进行的原因是 union 试图强加唯一性,因此它会一起处理所有这些行并按照对引擎最方便的顺序将它们取出。

如果您按照 Parado 的建议切换到 UNION ALL (它不会尝试强加唯一性),它将不会进行处理,它们将按照您放入的顺序进入表中,almost每时每刻。然而,这并不能得到保证,并且其他进程中发生的某些非常不寻常的情况(尤其是那些以某种方式触及临时表的进程)可能会影响它。

如果您按照 Kash 建议使用 order by,那么这将保证 id 的顺序(这可能很重要),但从技术上讲,不会保证行插入的顺序(这在实践中很少重要)。

关于其中的一些内容有很好的总结MSDN http://blogs.msdn.com/b/sqltips/archive/2005/07/20/441053.aspx.

所以,这就解决了原因。至于如何获得你真正想要的东西,我会使用 Kash 的建议,即添加一个列以与 order by 子句一起使用,但我会使用 UNION ALL 而不是 UNION。使用 UNION 就像添加和隐式“不同”要求,它会占用处理器周期并使查询计划更加复杂。

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

使用 UNION INSERT INTO SELECT 奇怪的顺序 的相关文章

随机推荐

  • Java - 登录到使用基于表单的身份验证的网站

    我正在尝试登录一个使用基于表单的身份验证的网站 以便我的应用程序可以进入 下载受保护的页面 然后退出 是的 我有一个有效的用户名 密码组合 I know 1 登录页面的url2 登录身份验证器的URL3 方法 帖子 4 我的信息 显然 5
  • NSNetworkManager.ResolveListener 消息 Android

    有人可以解释一下可以传递到回调中的错误消息吗 public void onResolveFailed NsdServiceInfo serviceInfo int errorCode 我以前见过错误代码 3 但不知道它意味着什么 该文档充其
  • 何时在 WCF 服务中调用析构函数

    我需要创建一个维护 WCF 会话的服务 在构造函数中 我从数据库读取数据 当会话结束时 我必须将其保存回来 如果我理解正确 当我在客户端上调用 Close 时 会话结束 我的客户端 ServiceClient 是使用 SvcUtil exe
  • Swift - tableView 中的可移动行仅在一个部分内,而不是在部分之间

    有没有办法防止 tableView 中的单元格移动到不同的部分 The sections具有不同类型单元格的数据 因此当用户尝试将单元格拖到不同部分时 应用程序会崩溃 我只想允许用户在该部分内移动单元格 而不是在部分之间移动 相关代码如下
  • Tensorboard 无法获取运行的第一个事件时间戳

    我正在尝试可视化我在远程服务器上训练的培训课程 我使用 scp 将文件复制到本地 iMac 中 我尝试通过运行张量板来可视化数据 它运行张量板网站 但我无法获得可视化效果 每个图表都有一个零点 我在终端上收到此警告 WARNING tens
  • 如何抑制“git rebase --continue”的编辑器?

    我经常重新调整交互式基础以对历史记录进行微小的更改 例如删除空白行或编辑一行 在大多数情况下 这些更改是基于一些同行评审 首先我这样做 git rebase interactive 83bbeb27fcb1b5e164318fa17c55b
  • 如何在Java中将英文数字转换为中文

    我必须将英文数字转换为中文数字 但中文的数字系统与英语不同 有什么办法可以在运行时将英文数字转换为中文吗 建议使用而不是自己滚动ICU4J http site icu project org 数字格式 http icu project or
  • 命名路由 _path 与 _url

    Rails 提供命名路线 http api rubyonrails org classes ActionDispatch Routing html 可以使用路径或 url 调用路由助手 例如来自文档 and provide these na
  • 当 Fiddler 可以解密时为什么要使用 HTTPS [重复]

    这个问题在这里已经有答案了 我刚刚发现 Fiddler 可以解密 HTTPS 流量 例如 我使用 HTTPS 在本地主机上部署了一个网站 在 Fiddler 中检查数据包时 我能够查看所有信息 因为它有解密选项 我的问题是 当 Fiddle
  • Java Spring Jackson json库返回unicode而不是文本

    我正在使用这个教程 http www mkyong com spring mvc spring 3 mvc and json example http www mkyong com spring mvc spring 3 mvc and j
  • SAP GUI 脚本 - 按钮按下失败

    我在运行 SAP GUI 的 Excel 文件中使用宏 有一个步骤 当我单击 SAP 中的按钮时 会弹出另一个窗口 为此 我编写了这样的代码 session findbyid wnd 0 XX btnXX press session fin
  • 使用模块在 Eclipse 中创建 Google App Engine 项目

    我一直在按照 cloud google com 上的建议使用 Eclipse 和 Maven 编写 GAE 应用程序 最近 我需要使用 后端 或一组不同的实例来处理特定任务 我发现 后端 已被弃用 取而代之的是 模块 在过去的几天里 我一直
  • C - for 循环的缩写,仅执行一次

    我在 Mac 上用 ANSI C 编写了命令行实用程序 其中包含为单链表创建冒泡排序数组的函数 我声明了循环变量 int a 0 int b 0 我以缩写风格编写了循环的冒泡排序 即 将变量初始化留空 for a lt size a for
  • 使用 Google 地图轨迹 API

    我必须开发一个车辆跟踪系统 我已经完成了 Google Map API 和 Google Map Tracks API 教程 IE Google 地图 API 网络 https developers google com maps docu
  • 在 Java 中如何将一个数组的值设置为另一个数组的值?

    假设您有两个数组 int a 2 3 4 int b 4 5 6 如何将数组 a 设置为数组 b 并使它们保持不同的不同对象 就像我想到这样做 a b 但这不起作用 因为它只是创建 a 引用数组b 那么 将两个数组设置为相等 同时保持它们独
  • 从序列图创建代码

    有没有办法从序列图生成代码 我能找到的只是逆向工程 即 从生成的代码中您可以获得序列图 有没有办法做其他事情 从图表到源代码生成 UML 类图已经实现了这一点 相同的链接http msdn microsoft com en us libra
  • 创建 App Engine 后端时找不到 gcm.jar 错误 => 建议安装已弃用的库

    使用 Android Developer Studio 我尝试从菜单中为现有 Android 项目创建 App Engine 后端 工具 gt Google Cloud 工具 gt 生成 App Engine 后端 错误消息是 找不到 gc
  • 如何将一些文件从一个 git 存储库移动到另一个(不是克隆),保留历史记录

    我们的 Git 存储库最初是一个庞大的 SVN 存储库的一部分 其中每个项目都有自己的树 如下所示 project1 branches tags trunk project2 branches tags trunk 显然 使用以下命令将文件
  • 在 PHP 中从序列化数组中获取一个值

    您认为从数组中获取单个值的最有效方法是什么 我知道它是什么 我知道它在哪里 目前我正在这样做 array unserialize storedArray var array keyOne 想知道是否有更好的方法 你做得很好 我想不出比你所做
  • 使用 UNION INSERT INTO SELECT 奇怪的顺序

    我有一个典型的非标准化表 tempTable 具有多个编号的列 rep1 rep2 所以我编写了一个脚本将非标准化数据插入到标准化表中 myTable insert into myTable select idRep rep FROM se