繁体   English   中英

来自 Select 流的 T-SQL 更新表

[英]T-SQL Update Table From Select Flow

我想知道在没有 where 子句的情况下从 select 语句更新时如何执行 sql 。

例子:

表格1

+---------+-----------+
| Column1 |   Column2 |
+---------+-----------+
|    3097 |   Empty   |
|    3097 |   Empty   |
+---------+-----------+

表 2

+---------+--------------------+
| Column1 |       Column2      |
+---------+--------------------+
|    3097 |   Camberwell       |
|    3097 |   Camberwell North |
+---------+--------------------+
Update a
Set a.column2 = b.column2
From Table1 a 
Inner join Table2 b On a.Column1=b.Column1

这是否意味着它将使用 Camberwell North 更新所有行的 Column2 ?

编辑后:--

WITH X AS 
(
SELECT * FROM
(
    SELECT ROW_NUMBER() over (order by Column1) As myRowNumber1,Column2 AS Column2tbl1 FROM Table1
)a1
INNER JOIN
(
    SELECT ROW_NUMBER() over (order by Column1) As myRowNumber2,Column2 AS Column2tbl2  FROM Table2
)b1
ON a1.myRowNumber1=b1.myRowNumber2
)
UPDATE X
set Column2tbl1=Column2tbl2

这可以使用 ROWNUMBER().......

在这里,我在两个表上执行 ROWNUMBER() 然后更新 Table1

我们可以实现......就像第 1 行表 1 与第 1 行表 2 匹配。更新到 Camberwell。 然后第 1 行表 1 匹配第 2 行表 2。

Output:- 在此处输入图像描述

回答您的问题,这可能是一个有趣的答案。 我能够对此进行测试并确定大多数标准连接( Inner、Left、Full Outer )给出了“第一”行的答案并忽略了第二行

在此处输入图像描述

但是,一个连接做了一个:

在此处输入图像描述

我刚试过这个,很惊讶我没有收到错误。 相反,正如您所假设的那样, Table1.Column2已使用Table2中第一行的结果进行了更新。

   CREATE TABLE #test1 (Col1 int, Col2 varchar(10))
   CREATE TABLE #test2 (Col1 int, Col2 varchar(10))
   INSERT INTO #test1 (col1) Values (3097), (3097)
   INSERT INTO #test2 (Col1, Col2) Values (3097, 'C1'), (3097, 'C2')

    UPDATE #test1 SET Col2 = #test2.Col2 
    FROM #test1 INNER JOIN #test2 ON #test1.Col1=#test2.Col1

结果是:

    SELECT * FROM #test1
Col1    Col2
3097    C1
3097    C1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM