在同一 SQL 查询中使用“WITH”和“UPDATE”语句

2024-03-26

我有一个表格,需要使用 Excel 电子表格中的一些数据进行更新。我正在考虑这样的查询:

WITH temp AS(
(SELECT 'abcd' AS oldvalue, 'defg' AS newvalue FROM dual) UNION
(SELECT .....) --About 300 lines of this, copied from Excel and then formatted into the SELECT statement
)
UPDATE mytable
   SET name = (SELECT newvalue FROM temp WHERE mytable.name = temp.oldvalue)

但Oracle似乎不喜欢在同一个查询中使用“WITH”和“UPDATE”语句。我收到一条错误消息“缺少 SELECT 关键字”。我发现我可以将临时表定义放在 SELECT 语句中,即

 SET name = (SELECT newvalue FROM (
         (SELECT 'abcd' AS oldvalue, 'defg' AS  newvalue FROM dual) UNION
         (SELECT .....)
          ) temp WHERE mytable.name = temp.oldvalue)

但这是在查询中间定义这样一个表的代码非常非常混乱。我一想到这个就感到畏缩。必须有更好的方法来做到这一点。我应该设置一个全局临时表吗?或者我只是缺少一些简单的语法,可以使其以原始方式工作?


您可以在更新中使用 with 子句;你只需要在正确的地方做:

UPDATE mytable
   SET name = (WITH temp AS((SELECT 'abcd' AS oldvalue, 'defg' AS newvalue FROM dual) UNION
                            (SELECT .....) --About 300 lines of this, copied from Excel and then formatted into the SELECT statement
                           )
               SELECT newvalue
               FROM   temp
               WHERE  mytable.name = temp.oldvalue);

但是,您可能只想更新临时子查询中存在的行,因此您需要一个额外的 where 子句:

UPDATE mytable
   SET name = (WITH temp AS((SELECT 'abcd' AS oldvalue, 'defg' AS newvalue FROM dual) UNION
                            (SELECT .....) --About 300 lines of this, copied from Excel and then formatted into the SELECT statement
                           )
               SELECT newvalue
               FROM   temp
               WHERE  mytable.name = temp.oldvalue)
WHERE  EXISTS (WITH temp AS((SELECT 'abcd' AS oldvalue, 'defg' AS newvalue FROM dual) UNION
                            (SELECT .....) --About 300 lines of this, copied from Excel and then formatted into the SELECT statement
                           )
               SELECT NULL
               FROM   temp
               WHERE  mytable.name = temp.oldvalue);

或者,使用 MERGE 语句:

merge into mytable tgt
  using (WITH temp AS((SELECT 'abcd' AS oldvalue, 'defg' AS newvalue FROM dual) UNION
                      (SELECT .....) --About 300 lines of this, copied from Excel and then formatted into the SELECT statement
                     )
         SELECT mytable.rowid r_id,
                temp.newvalue
         FROM   temp
         inner  join mytable on mytable.name = temp.oldvalue) src
    on (tgt.rowid = src.r_id)
when matched then
update set tgt.name = src.newvalue;

注意:您必须连接到合并语句的源查询中的实际表,因为您正在尝试更新正在连接的列,而您无法在合并语句中执行此操作 - 因此我已将合并连接切换为加入 mytable.rowid。

您必须测试这两个语句,看看哪一个对您的数据性能最佳。

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

在同一 SQL 查询中使用“WITH”和“UPDATE”语句 的相关文章

  • 在 SQL 中合并具有重叠日期范围的记录

    编辑 我们当前的服务器是 SQL 2008 R2 因此 LAG LEAD 功能将不起作用 我正在尝试获取表中的多个数据流并将它们组合成 1 个数据流 鉴于下面的 3 个数据流 我希望最终结果是 1 个优先考虑状态 on 的流 递归似乎是最好
  • PL/SQL 打印存储过程返回的引用游标

    如何从存储过程 OUT 变量 返回的引用游标中获取数据并将结果行打印到 SQL PLUS 中的 STDOUT ORACLE存储过程 PROCEDURE GetGrantListByPI p firstname IN VARCHAR2 p l
  • postgres union 是否保证调用有副作用的函数时的执行顺序?

    我正在使用 postgres 9 3 并尝试确保从 sql 语句调用时按顺序调用存储过程 以下操作是否有效 确保首先调用 foo 然后调用 bar select null void from select 1 from foo union
  • Oracle SQL 上的条件 SUM

    我通过以下方式获得数据 ITEM LOCATION UNIT RETAIL QUANTITY 100 KS 10 10 200 KS 20 30 我想要正数量的总和 数量 gt 0 和负数量的总和 数量 如何根据条件获得这些列的总和 您可以
  • 如何对表中的每一行运行特定的sql查询?

    所以我的数据库中有两个表 它们看起来都是这样的 通讯 拨打电话 Timestamp FromIDNumber ToIDNumber GeneralLocation 2012 03 02 09 02 30 878 674 Grasslands
  • 当所有子记录满足条件时仅选择父记录

    我有两个表 A 和 B 当所有子项 表 B 中 满足条件时 我只需要父项 A 的行 如果 B 中的一行不符合条件 那么我不需要父 A 的行 我想我需要在这里使用存在 但不展示如何使用 以下是数据表 Table A Primary Key L
  • Oracle 日期索引很慢。没有它查询速度快 300 倍

    我有一个 Oracle 查询 如下所示 运行时间为 10 分钟或更长时间 select r range text as duration range nvl count c call duration 0 as calls nvl SUM
  • Postgres 在插入访问 NEW 后触发

    我有一个非常简单的触发器 CREATE OR REPLACE FUNCTION f log datei RETURNS TRIGGER AS BEGIN INSERT INTO logs aktion tabelle benutzer id
  • SQL 查询返回按周、月和年分组的记录。没有记录的周数应返回 0

    给出以下数据 ID CreatedDate ID1 2014 06 04 01 40 56 880 ID8 2014 06 05 00 27 02 403 ID6 2014 06 04 01 51 47 060 ID7 2014 06 05
  • Android 上的查询何时返回 Null?

    我似乎没有找到任何有关查询 插入或任何其他返回 null 的 SQL 方法的信息 但如果发生错误 它就会发生 我只是想知道游标为空是否意味着发生了错误 或者是否意味着没有选择任何行 例如 我不知道应该如何对待它 作为一个错误或可能不时发生的
  • BigQuery 中的 EXP() 返回浮点错误

    我有以下查询 SELECT EXP col FROM project dataset tablename Where col is FLOAT 但是 我收到此错误 Error Floating point error in function
  • 防止 sqlplus 截断列名,无需单独的列格式

    默认情况下 sqlplus 将列名截断为基础数据类型的长度 我们数据库中的许多列名称都以表名称为前缀 因此在截断时看起来相同 我需要在锁定的生产环境中向远程 DBA 指定 select 查询 并拖回假脱机结果以进行诊断 列太多 无法指定各个
  • 发生错误:“无法调用 nvarchar 上的方法。”

    我编写了一个查询来查找与特定问题相关的答案 但在运行此代码时收到此错误 无法调用 nvarchar 上的方法 select Posts Id as Answer ParentId as question User DisplayName a
  • 检索多行最后插入的 id

    当将数据插入具有自动递增 PK 的表时 我需要获取该密钥以在另一个语句中使用 正如许多问题所示 这可以在 PHP 中使用mysql insert id 但是 我一直将插入内容分组在一起 因此一次插入不止一行 我这样做是因为我猜测可能会存在一
  • 适用于 Web 照片库的正确 NoSQL 数据架构

    我正在寻找为照片库的 NoSQL 存储构建合适的数据结构 在我的网络应用程序中 一张照片可以是一个或多个相册的一部分 我有使用 MySQL 的经验 但几乎没有使用键值存储的经验 使用 MySQL 我将设置 3 个表 如下所示 photos
  • 在SSIS中导入已合并单元格的Excel

    我的问题是在读取合并 组合列单元格的 Excel 文件时 例如 将下面的excel数据读取到数据库中 Excel 输入 ID NAME DEPT FNAME LNAME 1 Akil Tiwari IT 2 Vinod Rathore IT
  • 查找包含具有指定名称的列的所有表 - MS SQL Server

    想要改进这篇文章吗 提供此问题的详细答案 包括引用和解释为什么你的答案是正确的 不够详细的答案可能会被编辑或删除 是否可以查询包含以下列的表名 LIKE myName 搜索表 SELECT c name AS ColumnName SCHE
  • 为什么sql表名中通常使用下划线而不是驼峰式大小写[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 基于 MySQL 中的另一列创建计算列

    我的表中有 2 列 varchar 8 and an int 我想要auto increment the int column当我这样做时 我想将值复制到varchar 8 column 但用 0 填充它直到它达到 8 个字符长 因此例如
  • 插入到表中并在 SQL 中拆分字符串

    我想将分割字符串插入到我的表中 如您所见 create table Organization organizationId bigint provienceId bigint CityId bigint TownId bigint Inse

随机推荐

  • 使用 Spring boot 的 Ehcache 在测试环境中不起作用

    我正在使用 Spring boot 1 4 2 RELEASE 和 Ehcache 2 4 3 缓存正在开发环境中使用 但在其他环境 测试和生产 中没有使用 命中 代码如下 pom xml
  • libdtrace 缓冲输出

    我正在尝试通过 libdtrace 使用 dtrace 在 Snow Leopard 上 10 6 4 我想在我自己的程序中捕获 dtrace 脚本的打印输出 一种方法是将输出转到临时文件并从那里读取 但是 libdtrace 支持回调函数
  • Quill.js:制作自定义链接格式 - 或 - 具有相同标签名称的自定义格式

    我正在使用鹅毛笔1 0 0 rc 1 如何制作几种不同类型的链接格式 我制作了三种不同类型的链接格式 添加了data link type属性 当我创建链接时 一切都很好 但是 当我使用将内容重新加载到编辑器中时pasteHTML 自上次注册
  • __zone_symbol__currentTask 错误

    我收到错误 zone symbol currentTask type microTask state notScheduled source Promise then zone angular cancelFn null runCount
  • 单击按钮时使球弹起

    I wrote a program to move a ball when a button is clicked It is a part of experiment for a bigegr project Here is the sc
  • 使用 LINQ to SQL SubmitChanges() 时,什么会导致 SqlDateTime 溢出?

    在我的代码中 我将多个对象添加到存储库中 我尝试在所有循环结束时运行一次存储库 Save 函数 并在添加每个对象后调用它 但无论哪种方式 当存储库 Save 中的 db SubmitChanges 时 我仍然会遇到 SqlDateTime
  • 事件可以声明为静态吗?如果可以,如何声明以及为什么

    我想知道我们是否可以将事件声明为静态 如果可以 为什么以及此类声明的应用 请提供样品 眼见为实 您可以创建静态事件 使用它们的方式与普通事件相同 只不过它是在类内的静态上下文中使用 public class MyClass public s
  • 具有不同参数的 C++ 成员函数指针 - 还是这很糟糕?

    尽管我担心你会告诉我这个话题已经被讨论过好几次了 但我还是敢问 因为我无法生成解决方案 也许我只是在寻找错误的东西 假设我有一个从某些外部函数接收 模式 的函数 根据模式的不同 函数会调用同一对象的不同成员函数 对于没有任何参数的成员函数
  • 如何用相邻值替换数据框中的 NA(缺失值)

    862 2006 05 19 6 241603 5 774208 863 2006 05 20 NA NA 864 2006 05 21 NA NA 865 2006 05 22 6 383929 5 906426 866 2006 05
  • 如何从 SonarQube 提取或导出规则

    如果我能获得以下情况的帮助 请感激 我的问题是确定如何在 SonarQube 4 5 7 上提取 导出所有 java 规则 我尝试了以下两个 API 调用 但收到 您正在查找的页面不存在 我的 sonarqube 版本显示了 781 个 j
  • 如何从 Carrierwave Uploader 对象引用父模型

    我想在通过 Carrierwave 完成文件上传后运行一些方法 Carrierwave包含几种回调方法详解here https github com jnicklas carrierwave wiki How to 3a use callb
  • Google Chrome 中的 DOM 过载问题

    我在 Google Chrome 中使用大量隐藏项目时遇到一些问题 最近 我发布了一个问题 https stackoverflow com questions 56329780 inexplicit task in chrome perfo
  • 毛伊岛内容页面视图中的视图模型未被识别

    我试图理解毛伊岛的服务 但注入并没有在视图中重新认识它 namespace FoodOrder ViewModels public class MenusViewModel IMenuServiceInterface menuService
  • 由于内存压力而终止应用程序

    我有一个应用程序可以在连拍模式下拍摄图像 但是一旦拍摄图像并即将出现预览时 它就会崩溃并且错误显示 由于内存压力而终止应用程序 当用户按住相机按钮时 我需要拍摄更多数量的图像 离开按钮后 我需要将所有图像显示为幻灯片 我必须做什么 我的代码
  • Rails 3:如何正确显示“textarea”中的文本?

    在我的 Rails 3 应用程序中我使用textarea让用户在论坛中撰写新消息 但是 当显示消息时 所有换行符看起来都像空格 没有 br 也许还有其他不匹配的例子 我还不知道 我想知道处理这个问题最合适的方法是什么 我猜想存储在数据库中的
  • 如何让线程构建块在 Ubuntu 14.04 中工作

    我想让 TBB 工作 但在 Ubuntu 14 04 上编译工作有点困难 我认为这可能是为编译器设置库位置的问题 我使用以下命令安装了 TBB sudo apt get install libtbb dev 我现在正在尝试编译一个小测试示例
  • 如何编写读取退回电子邮件的 PHP 脚本?

    我正在使用 PHP 处理退回电子邮件 我已在邮件功能中包含返回路径 例如 mail to address subject message headers f return path return path email protected c
  • 如果我不等待任务会怎样?

    考虑这个例子 var task DoSomething bool ready await DoSomethingElse if ready return null var value await DoThirdThing depends o
  • 从项目根目录移动 cypress 文件夹

    当我安装并运行 cypress 时 它会搭建一个cypress 我的项目根目录中的文件夹 问题是所有其他测试相关数据都存储在test 文件夹 有没有简单的方法可以将其移动到test cypress并配置 cypress 来查看那里 赛普拉斯
  • 在同一 SQL 查询中使用“WITH”和“UPDATE”语句

    我有一个表格 需要使用 Excel 电子表格中的一些数据进行更新 我正在考虑这样的查询 WITH temp AS SELECT abcd AS oldvalue defg AS newvalue FROM dual UNION SELECT