8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

如何从 SQL Server 中的 SELECT 进行更新?

Gunter Abreu 2月前

206 0

在 SQL Server 中,可以使用 INSERT 将行插入表中。SELECT 语句:INSERT INTO Table (col1, col2, col3)SELECT col1, col2, col3 FROM other_table WHERE sql = 'cool'Is i...

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、本帖标题:如何从 SQL Server 中的 SELECT 进行更新?
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Gunter Abreu在本站《sql-server》版块原创发布, 转载请注明出处!
最新回复 (0)
  • @theking2 这个问题有点太复杂,无法用几句话回答,但我在我的新书《SQL 语言》(法语)中解释了原因,这本书将在几个月后在developpez.com 网站上免费提供

  • lant 2月前 0 只看Ta
    引用 3

    无论是否使用 USING,NATURAL 连接都是一个邪恶的特性,可能会导致错误的答案和灾难性的响应时间......

  • 回复“原始问题中的查询”:什么?第一个修订版被标记为 SQL Server(Microsoft 产品)。

  • 需要指出的是,正如其他人所说, MySQL or MariaDB 使用不同的语法。此外,它还支持非常方便的 USING 语法(与 T/SQL 相反)。此外,INNER JOIN 与 JOIN 同义。因此,原始问题中的查询最好在 MySQL 中实现:

    UPDATE
        Some_Table AS Table_A
    
    JOIN
        Other_Table AS Table_B USING(id)
    
    SET
        Table_A.col1 = Table_B.col1,
        Table_A.col2 = Table_B.col2
    
    WHERE
        Table_A.col3 = 'cool'
    

    我没有在其他答案中看到对所提问题的解决方案,因此我提供我的看法。 (在 PHP 7.4.0 MariaDB 10.4.10 上测试)

  • UPDATE table1
    SET column1 = (SELECT expression1
                   FROM table2
                   WHERE conditions)
    [WHERE conditions];
    

    在 SQL Server 中使用另一个表中的数据更新一个表时 UPDATE 语句的语法。

  • 它对你有用吗?我使用了完全相同的查询,但在使用内部连接时出现错误,别名无法解析。但是,相关子查询运行良好。

  • 选项 1:使用内连接:

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

    选项 2:相关子查询

    UPDATE table 
    SET Col1 = B.Col1, 
        Col2 = B.Col2 
    FROM (
        SELECT ID, Col1, Col2 
        FROM other_table) B
    WHERE 
        B.ID = table.ID
    
  • 这个答案出现在低质量审核队列中,大概是因为您没有提供任何代码解释。如果此代码回答了问题,请考虑在您的答案中添加一些解释代码的文字。这样,您更有可能获得更多赞成票 - 并帮助提问者学习新知识。

  • 从选择语句更新的另一种方法:

    UPDATE A
    SET A.col = A.col,B.col1 = B.col1
    FROM  first_Table AS A
    INNER JOIN second_Table AS B  ON A.id = B.id WHERE A.col2 = 'cool'
    
  • mayi 2月前 0 只看Ta
    引用 11

    以下解决方案适用于 MySQL 数据库:

    UPDATE table1 a , table2 b 
    SET a.columname = 'some value' 
    WHERE b.columnname IS NULL ;
    
  • UPDATE table AS a
    INNER JOIN table2 AS b
    ON a.col1 = b.col1
    INNER JOIN ... AS ...
    ON ... = ...
    SET ...
    WHERE ...
    
  • awx 2月前 0 只看Ta
    引用 13

    接受的答案 ,之后:

    SET
    Table_A.col1 = Table_B.col1,
    Table_A.col2 = Table_B.col2
    

    我想补充一点:

    OUTPUT deleted.*, inserted.*
    

    我通常会把所有东西都放入回滚事务中,然后使用 "OUTPUT" : 这样我就能看到即将发生的一切。当我对所看到的内容感到满意时,我会将 ROLLBACK 改为 COMMIT .

    我通常需要记录我所做的事情,因此我 "results to Text" 在运行回滚查询时使用该选项,并保存脚本和 OUTPUT 的结果。(当然,如果我更改了太多行,这并不实用)

  • 使用:

    drop table uno
    drop table dos
    
    create table uno
    (
        uid int,
        col1 char(1),
        col2 char(2)
    )
    create table dos
    (
        did int,
        col1 char(1),
        col2 char(2),
        [sql] char(4)
    )
    insert into uno(uid) values (1)
    insert into uno(uid) values (2)
    insert into dos values (1,'a','b',null)
    insert into dos values (2,'c','d','cool')
    
    select * from uno 
    select * from dos
    

    任何一个:

    update uno set col1 = (select col1 from dos where uid = did and [sql]='cool'), 
    col2 = (select col2 from dos where uid = did and [sql]='cool')
    

    或者:

    update uno set col1=d.col1,col2=d.col2 from uno 
    inner join dos d on uid=did where [sql]='cool'
    
    select * from uno 
    select * from dos
    

    如果两个表中的 ID 列名相同,则只需将表名放在要更新的表之前,并为所选表使用别名,即:

    update uno set col1 = (select col1 from dos d where uno.[id] = d.[id] and [sql]='cool'),
    col2  = (select col2 from dos d where uno.[id] = d.[id] and [sql]='cool')
    
  • 这是同样的想法,但是是另一种方法 - 你根本不需要放置 \'select\' 来实现更新语句中的 JOIN 和 WHERE - 这是 SELECT 类型的查询,甚至不需要编写 SELECT

  • 我认为如果你在 #SOURCE 上使用 [_id],而不是与 #DESTINATION 相同的 [ID],他们可能会让你进行 JOIN。 \'on #DESTINATION.ID=#SOURCE._id。或者甚至使用表变量,如 @tbl,\'on PermTable.ID=@memorytbl._id\'。你试过了吗?我正在用手机回复,没有电脑可以尝试。

  • 还有一种 更短的方法 ,可能会让你感到惊讶:

    样本数据集:

    CREATE TABLE #SOURCE ([ID] INT, [Desc] VARCHAR(10));
    CREATE TABLE #DEST   ([ID] INT, [Desc] VARCHAR(10));
    
    INSERT INTO #SOURCE VALUES(1,'Desc_1'), (2, 'Desc_2'), (3, 'Desc_3');
    INSERT INTO #DEST   VALUES(1,'Desc_4'), (2, 'Desc_5'), (3, 'Desc_6');
    

    代码:

    UPDATE #DEST
    SET #DEST.[Desc] = #SOURCE.[Desc]
    FROM #SOURCE
    WHERE #DEST.[ID] = #SOURCE.[ID];
    
  • UPDATE TQ
    SET TQ.IsProcessed = 1, TQ.TextName = 'bla bla bla'
    FROM TableQueue TQ
    INNER JOIN TableComment TC ON TC.ID = TQ.TCID
    WHERE TQ.IsProcessed = 0
    

    为了确保更新所需内容,请先选择

    SELECT TQ.IsProcessed, 1 AS NewValue1, TQ.TextName, 'bla bla bla' AS NewValue2
    FROM TableQueue TQ
    INNER JOIN TableComment TC ON TC.ID = TQ.TCID
    WHERE TQ.IsProcessed = 0
    
  • 引用 19

    另一种方法是使用派生表:

    UPDATE t
    SET t.col1 = a.col1
        ,t.col2 = a.col2
    FROM (
    SELECT id, col1, col2 FROM @tbl2) a
    INNER JOIN @tbl1 t ON t.id = a.id
    

    示例数据

    DECLARE @tbl1 TABLE (id INT, col1 VARCHAR(10), col2 VARCHAR(10))
    DECLARE @tbl2 TABLE (id INT, col1 VARCHAR(10), col2 VARCHAR(10))
    
    INSERT @tbl1 SELECT 1, 'a', 'b' UNION SELECT 2, 'b', 'c'
    
    INSERT @tbl2 SELECT 1, '1', '2' UNION SELECT 2, '3', '4'
    
    UPDATE t
    SET t.col1 = a.col1
        ,t.col2 = a.col2
    FROM (
    SELECT id, col1, col2 FROM @tbl2) a
    INNER JOIN @tbl1 t ON t.id = a.id
    
    SELECT * FROM @tbl1
    SELECT * FROM @tbl2
    
  • 引用 20

    如果您使用的是 SQL Server,则可以从一张表更新另一张表,而无需指定连接,只需从子句链接两张表即可 where 。这使得 SQL 查询变得更加简单:

    UPDATE Table1
    SET Table1.col1 = Table2.col1,
        Table1.col2 = Table2.col2
    FROM
        Table2
    WHERE
        Table1.id = Table2.id
    
返回
作者最近主题: