如何从 SQL Server 中的 SELECT 更新?_HuntsBot的博客-程序员宝宝

技术标签: c++  mysql  数据库  sql  

问题描述:

在 SQL Server 中,可以使用 INSERT… SELECT 语句将行插入到表中:

INSERT INTO Table (col1, col2, col3)
SELECT col1, col2, col3 
FROM other_table 
WHERE sql = 'cool'

是否也可以更新带有 SELECT 的表?我有一个包含这些值的临时表,并想使用这些值更新另一个表。也许是这样的:

UPDATE Table SET col1, col2
SELECT col1, col2 
FROM other_table 
WHERE sql = 'cool'
WHERE Table.id = other_table.id

解决方案1:

保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com

UPDATE
    Table_A
SET
    Table_A.col1 = Table_B.col1,
    Table_A.col2 = Table_B.col2
FROM
    Some_Table AS Table_A
    INNER JOIN Other_Table AS Table_B
        ON Table_A.id = Table_B.id
WHERE
    Table_A.col3 = 'cool'

如果您正在编辑表之间的链接 (SET Table.other_table_id = @NewValue),请将 ON 语句更改为 ON Table.id = @IdToEdit AND other_table.id = @NewValue

@CharlesWood 是的。我在 MySQL 中有同样的问题。如果有人知道如何将它实现到 MySQL 并与大家分享,那就太好了。相信很多人都在寻找 MySQL 版本的解决方案

如何在集合中使用别名?更新表集合 a.col1 = b.col2 从表 a 内连接 table2 b on a.id = b.id;相反,我必须使用 update table set table.col1 = b.col2 from table a inner join table2 b on a.id = b.id;

有点相关,我经常喜欢先将我的 UPDATE 查询写成 SELECT 语句,这样我就可以在执行之前看到将要更新的数据。 Sebastian 在最近的一篇博文中介绍了一种技术:sqlity.net/en/2867/update-from-select

您不能执行 SET Table_A.col1 = SUM(Table_B.col1) 或任何其他聚合。 Jamal 的回答允许您将聚合放在 SELECT stackoverflow.com/a/8963158/695671

解决方案2:

huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式

在 SQL Server 2008(或更高版本)中,使用 MERGE

MERGE INTO YourTable T
   USING other_table S 
      ON T.id = S.id
         AND S.tsql = 'cool'
WHEN MATCHED THEN
   UPDATE 
      SET col1 = S.col1, 
          col2 = S.col2;

或者:

MERGE INTO YourTable T
   USING (
          SELECT id, col1, col2 
            FROM other_table 
           WHERE tsql = 'cool'
         ) S
      ON T.id = S.id
WHEN MATCHED THEN
   UPDATE 
      SET col1 = S.col1, 
          col2 = S.col2;

MERGE 也可用于“Upserting”记录;也就是说,UPDATE 如果匹配记录存在,INSERT 新记录如果没有找到匹配

对我来说,这比等效的 update...join 语句快了大约 10 倍。

MERGE 也可以用来删除。但要小心 MERGE,因为 TARGET 表不能是远程表。

合并错误:mssqltips.com/sqlservertip/3074/…

@SimonD:选择任何 SQL Server 关键字,您都会发现错误。你的观点?我敢打赌,与 UPDATE 相关的错误(以及更基本的错误)比 MERGE 更多,人们刚刚学会与他们相处,他们成为景观的一部分(“功能”)。考虑到当 UPDATE 是新来的孩子时,博客还不存在。

解决方案3:

与HuntsBot一起,探索全球自由职业机会–huntsbot.com

UPDATE YourTable 
SET Col1 = OtherTable.Col1, 
    Col2 = OtherTable.Col2 
FROM (
    SELECT ID, Col1, Col2 
    FROM other_table) AS OtherTable
WHERE 
    OtherTable.ID = YourTable.ID

这往往适用于几乎所有 DBMS,这意味着一次学习,到处执行。如果这对您来说比性能更重要,您可能更喜欢这个答案,特别是如果您的更新是为了更正某些数据而一次性完成的。

如果您需要使用第二个表的聚合设置第一个表,您可以将聚合放在 select 子查询中,因为您不能执行 SET Table_A.col1 = SUM(Table_B.col1)(或任何其他聚合函数)。为此目的,比罗宾戴的答案要好。

我真的很喜欢这个解决方案,因为它感觉像是对 INSERT ... SELECT 工作方式的自然赞美。感谢分享!

解决方案4:

huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感

我会将 Robin’s excellent answer 修改为以下内容:

UPDATE Table
SET Table.col1 = other_table.col1,
 Table.col2 = other_table.col2
FROM
    Table
INNER JOIN other_table ON Table.id = other_table.id
WHERE
    Table.col1 != other_table.col1
OR Table.col2 != other_table.col2
OR (
    other_table.col1 IS NOT NULL
    AND Table.col1 IS NULL
)
OR (
    other_table.col2 IS NOT NULL
    AND Table.col2 IS NULL
)

如果没有 WHERE 子句,您甚至会影响不需要影响的行,这可能(可能)导致索引重新计算或触发真正不应该触发的触发器。

这假设没有任何列可以为空。

你是对的,我是手动输入示例的。我在 where 语句中添加了第三个和第四个子句来处理这个问题。

WHERE EXISTS(SELECT T1.Col1, T1.Col2 EXCEPT SELECT T2.Col1, T2.Col2)) 更简洁。

语句不应该在 where 子句中也包含这两个吗? (other_table.col1 为空且 table.col1 不为空)或(other_table.col2 为空且 table.col2 不为空)

取决于您是否想用源中的空值替换目标中的空值。很多时候,我不会。但是如果你这样做了,Martin 对 where 子句的构造是最好的使用方法。

解决方案5:

huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。

单程

UPDATE t 
SET t.col1 = o.col1, 
    t.col2 = o.col2
FROM 
    other_table o 
  JOIN 
    t ON t.id = o.id
WHERE 
    o.sql = 'cool'

解决方案6:

打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!

尚未提及的另一种可能性是将 SELECT 语句本身放入 CTE,然后更新 CTE。

WITH CTE
     AS (SELECT T1.Col1,
                T2.Col1 AS _Col1,
                T1.Col2,
                T2.Col2 AS _Col2
         FROM   T1
                JOIN T2
                  ON T1.id = T2.id
         /*Where clause added to exclude rows that are the same in both tables
           Handles NULL values correctly*/
         WHERE EXISTS(SELECT T1.Col1,
                             T1.Col2
                       EXCEPT
                       SELECT T2.Col1,
                              T2.Col2))
UPDATE CTE
SET    Col1 = _Col1,
       Col2 = _Col2;

这样做的好处是,很容易首先单独运行 SELECT 语句以检查结果,但如果它们在源表和目标表中的名称相同,则需要您按上述方式对列进行别名。

这也与其他四个答案中显示的专有 UPDATE … FROM 语法具有相同的限制。如果源表位于一对多连接的多端,则不确定将在 Update 中使用哪个可能的匹配连接记录(如果存在,MERGE 通过引发错误来避免这个问题)是尝试多次更新同一行)。

CTE 这个名字有什么含义吗?

@ShivanRaptor - 它是 Common Table Expression 的首字母缩写。在这种情况下只是一个任意别名。

这也适用于多个 CTE:;WITH SomeCompexCTE AS (...), CTEAsAbove AS (SELECT T1.Col1,... FROM T1 JOIN SomeComplexCTE...) UPDATE CTEAsAbove SET Col1=_Col1, ...

解决方案7:

huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!

作为记录(以及其他像我一样搜索的人),您可以在 MySQL 中这样做:

UPDATE first_table, second_table
SET first_table.color = second_table.color
WHERE first_table.id = second_table.foreign_id

解决方案8:

huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求

使用别名:

UPDATE t
   SET t.col1 = o.col1
  FROM table1 AS t
         INNER JOIN 
       table2 AS o 
         ON t.id = o.id

解决方案9:

一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会

简单的方法是:

UPDATE
    table_to_update,
    table_info
SET
    table_to_update.col1 = table_info.col1,
    table_to_update.col2 = table_info.col2

WHERE
    table_to_update.ID = table_info.ID

这不是 SQl Server 语法,它在 SQL Server 中不起作用

解决方案10:

huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求

这可能是执行更新的一个利基原因(例如,主要用于过程中),或者对其他人来说可能很明显,但也应该说明您可以在不使用连接的情况下执行更新选择语句(如果您正在更新的表没有公共字段)。

update
    Table
set
    Table.example = a.value
from
    TableExample a
where
    Table.field = *key value* -- finds the row in Table 
    AND a.field = *key value* -- finds the row in TableExample a

我觉得这应该是公认的答案,因为它使事情变得简单明了。

解决方案11:

huntsbot.com – 高效赚钱,自由工作

这是另一个有用的语法:

UPDATE suppliers
SET supplier_name = (SELECT customers.name
                     FROM customers
                     WHERE customers.customer_id = suppliers.supplier_id)
WHERE EXISTS (SELECT customers.name
              FROM customers
              WHERE customers.customer_id = suppliers.supplier_id);

它通过使用“WHERE EXIST”检查它是否为空。

唯一对我有用的答案。我正在使用 MariaDB,我的查询格式为:SELECT value FROM table_1 INNER JOIN ( SELECT * FROM table_2 WHERE ..... ) ON ( ...... )

原文链接:https://www.huntsbot.com/qa/jW7l/how-do-i-update-from-a-select-in-sql-server?lang=zh_CN

打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/kalman2019/article/details/128300831

智能推荐

排查Java 内存泄露-借助排查工具_java内存泄露排查工具_扎克begod的博客-程序员宝宝

转自:https://juejin.im/entry/57fb07255bbb50005b2f20acjava内存泄露典型特征现象一: 堆/Perm 区不断增长, 没有下降趋势(回收速度赶不上增长速度), 最后不断触发FullGC, 甚至crash(如下**两张图是同一个应用的GC和Perm数据, GC触发原因确认是Perm不足**)
. 一般是现象二的晚期表现.现象二:每次Full...

java 贝塞尔曲线_贝塞尔曲线:原理、自定义贝塞尔曲线View、使用!!!_最暖最珍贵的博客-程序员宝宝

一、原理转自:http://www.2cto.com/kf/201401/275838.htmlAndroid动画学习Demo(3) 沿着贝塞尔曲线移动的Property AnimationProperty Animation中最重要,最基础的一个类就是ValueAnimator了。Property Animation利用ValueAnimator来跟踪记录对象属性已经变化了多长时间及当前这个时间...

PHP实现获取第一个中文首字母并进行排序的方法_媔笣的博客-程序员宝宝

本文实例讲述了PHP实现获取第一个中文首字母并进行排序的方法。分享给大家供大家参考,具体如下:最近在做储值结算,需求里结算首页需要按门店的首字母A-Z排序。我的数据结构原本是这样的:Array( [0] => Array ( [sid] => 2885842 [recetcstoredpay] => 24000 [recetclprinciple] => 23465 [paytcstoredpay] => 545

堆区和栈区的区别【转】_weixin_34297300的博客-程序员宝宝

本文转载自: 堆和栈的区别一、预备知识—程序的内存分配    一个由C/C++编译的程序占用的内存分为以下几个部分    1、栈区(stack)—   由编译器自动分配释放   ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。    2、堆区(heap)   —   一般由程序员分配释放,   若程序员不释放,程序结束时可能由OS回收   。注意它与数据结构中的堆是两回事,...

windows下安装gcc_folly windows_folly_zhou的博客-程序员宝宝

在网上找了安装gcc教程,第一次找的怎么也安装不成功,第二次成功了,还简单,写一下吧链接:https://pan.baidu.com/s/1C63PdlWMGkIOHjezuB5pjQ提取码:ynw71.下载安装,可以用我放在上面的,也可去MinGW的主页去找最新版本2.运行Download mingw-get-setup.exe,点击运行,countinue,记住自己的安装目录,下一步修改环境变量会用到3.修改环境变量:在系统变量path中添加刚刚记录的路径,如 E:gcc\MinGw\bin

STM32初识及运用—GPIO___HYJ__的博客-程序员宝宝

(本博客所有关于32的文章都是基于stm32f103c8t6)GPIO初识——理论讲解GPIO的工作模式四种输入模式上拉输入:若GPIO引脚配置为上拉输入模式,在默认情况下(GPIO引脚无输入),读取 得的GPIO引脚数据位1,高电平。下拉输入:若GPIO引脚配置为下拉输入模式,在默认情况下(GPIO引脚无输入),读取 得的GPIO引脚数据位0,低电平。浮空输入:在芯片内部既没有接上拉,也没有接下拉电阻,经由触发器输入。配置成这个模式直接用电压表测量其引脚电压为1点几伏,这是个不确定值。

随便推点

【问题记录】java.lang.IllegalStateException: Detected both log4j-over-slf4j.jar AND bound slf4j-log4j12.ja_thrunder liu的博客-程序员宝宝

【问题记录】java.lang.IllegalStateException: Detected both log4j-over-slf4j.jar AND bound slf4j-log4j12.jar on the class pathSLF4J: Class path contains multiple SLF4J bindings.SLF4J: Found binding in [jar:file:/C:/Users/liulei06/.m2/repository/org/slf4j/slf4j-

UE4 Character旋转_sh15285118586的博客-程序员宝宝

还好之前研究了一下,现在拿来就用,不知道以前怎么弄的,现在都给忘了,回忆一下。旋转代码:设置固定角度:轻松搞定。

黑色星期五c语言程序,求黑色星期五问题~_田鸡饭的博客-程序员宝宝

该楼层疑似违规已被系统折叠隐藏此楼查看此楼用简单的printf能编写出来,就是写的多了点.#includemain(){inti,j,k,s;printf("pleaseenteryearandweek:");scanf("%d",&i);printf("\n");scanf("%d",&j);clrscr();if((13%7+j-1)%7==5)printf("%...

高并发ab压力测试工具_高并发测试工具_蜜桃先生的博客-程序员宝宝

Apache ab介绍 : Apache Benchmark(简称ab) 是Apache安装包中自带的压力测试工具注: centos6 默认安装 ab安装命令yum install y httpd-tools查看帮助手册ab --help

Magento2变化部署却没有响应_qq_36145708的博客-程序员宝宝

我与Magento2工作,有问题,我的变化是后一个完整的才可见php bin/magento setup:static-content:deploy en_US。先决条件:Magento的2.1.0Linux的虚拟机与Apache / PHP7开发模式激活缓存无效,刷新我换了一个HTML文件自定义模块中的KO-模板,并试图看到前台的变化没有一个完整的静态部署。但它仍然显

流程控制—分支结构if-else、switch循环语句while、do...while_m0_53179419的博客-程序员宝宝

流程控制1顺序结构顺序结构是程序中最简单的流程控制,没有特定的语法结构,按照代码的先后顺序依次执行。2.分支结构单分支if语句格式:if (关系表达式){语句体;}if-else双分支结构if (){} else {}if-else多分支结构格式if(关系表达式){; }else if (关系…){;}else{}3.switch语句格式:(伪代码)switch(表达式){case 值1: 语句体1; break;case 值2: 语句体2

推荐文章

热门文章

相关标签