牛逼SQL合并例子来帮助理解需要牛逼SQL合并例子来帮助理解需要(T SQL merge examp

2019-05-13 13:59发布

下列:

MERGE dbo.commissions_history AS target
USING (SELECT @amount, @requestID) AS source (amount, request)
ON (target.request = source.request)
WHEN MATCHED THEN
    UPDATE SET amount = source.amount
WHEN NOT MATCHED THEN
    INSERT (request, amount)
    VALUES (source.request, source.amount);

从https://stackoverflow.com/a/2967983/857994是做插入/更新(并增加了一些工作,删除)一个非常漂亮的方式。 我发现很难遵循但即使一些谷歌上搜索后。

可有人请:

  • 解释这个有点简单来说 - MSDN文档肢解我的大脑在这种情况下。
  • 我展示如何可以修改,以便用户可以在键入量请求的值,而不是让它们从另一个数据库位置选择?

基本上,我想用此方法从我得到的XML文件取信息的C#应用​​程序插入/更新。 所以,我需要了解我怎么可以手动制定一个查询,让我的解析数据与该机构的数据库。

Answer 1:

如果你不熟悉的语句组合那么这就是你需要开始。 了解如何加入工作的关键是休息。 一旦你熟悉的加入则理解合并是最容易被想到它是一个完整的对什么该做或不匹配的行做说明加入。

因此,使用所提供的代码示例让我们看看表commissions_history

|  Amount  |   Request  |   <other fields> |
--------------------------------------------
|  12.00   |   1234     |   <other data>   |
|  14.00   |   1235     |   <other data>   |
|  15.00   |   1236     |   <other data>   |

MERGE语句创建一个表之间的全面加入,被称为“目标”,并返回一个表(或结果集是逻辑上非常相似,像CTE表)被称为“源”的表达。

在这个例子给它使用变量,我们将假定已经由用户设置或作为参数传递的来源。

DECLARE @Amount Decimal = 18.00;
DECLARE @Request Int = 1234;

MERGE dbo.commissions_history AS target       
USING (SELECT @amount, @requestID) AS source (amount, request)       
ON (target.request = source.request)   

创建时为联合认为以下结果集。

|  Amount  |   Request  |   <other fields> | Source.Amount | Source.Request  |
------------------------------------------------------------------------------
|  12.00   |   1234     |   <other data>   |   18.00       |     1234        |
|  14.00   |   1235     |   <other data>   |   null        |     null        |
|  15.00   |   1236     |   <other data>   |   null        |     null        |

用什么做的目标上找到匹配条件的指示。

WHEN MATCHED THEN        
UPDATE SET amount = source.amount    

所得到的目标表现在看起来是这样。 与要求1234行被更新为18。

|  Amount  |   Request  |   <other fields> |
--------------------------------------------
|  18.00   |   1234     |   <other data>   |
|  14.00   |   1235     |   <other data>   |
|  15.00   |   1236     |   <other data>   |

由于比赛被发现没有什么事情发生。 但让说,从源头值都像这样。

DECLARE @Amount Decimal = 18.00;
DECLARE @Request Int = 1239;

得到的加入应该是这样的:

|  Amount  |   Request  |   <other fields> | Source.Amount | Source.Request  |
------------------------------------------------------------------------------
|  12.00   |   1234     |   <other data>   |   null        |     null        |
|  14.00   |   1235     |   <other data>   |   null        |     null        |
|  15.00   |   1236     |   <other data>   |   null        |     null        |
|  null    |   null     |   null           |   18.00       |     1239        |

由于匹配的行并没有在目标中找到的语句执行的其他条款。

WHEN NOT MATCHED THEN                                 
INSERT (request, amount)                                 
VALUES (source.request, source.amount);  

导致目标表,现在看起来是这样的:

|  Amount  |   Request  |   <other fields> |
--------------------------------------------
|  12.00   |   1234     |   <other data>   |
|  14.00   |   1235     |   <other data>   |
|  15.00   |   1236     |   <other data>   |
|  18.00   |   1239     |   <other data>   |

合并报表的真正潜力是当源和目标都大表。 因为它可以用一个简单的语句每行做大量的更新和/或插入的。

最后要注意的。 重要的是要记住,是很重要的not matched默认为全部条款not matched by target ,但是你可以指定not matched by source代替,或补充,默认条款。 合并声明(在未在源目标在源记录不在目标,或记录由上子句定义 )支持两种类型的失配。 你可以找到完整的文档,限制和MSDN上的完整语法。



Answer 2:

在给出的答案例如你做

DECLARE @Request Int

,但在SQL调用它,如下所示:

SELECT @amount, @requestID

另一个办法是命名和调用相同的变量:

@amount vs. Amount -> @Amount & Amount


文章来源: T SQL merge example needed to help comprehension
标签: tsql merge