gpt4 book ai didi

t-sql - 需要 T SQL 合并示例来帮助理解

转载 作者:行者123 更新时间:2023-12-03 07:25:04 24 4
gpt4 key购买 nike

以下内容:

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 文档在这种情况下毁掉了我的大脑。
  • 告诉我如何修改它,以便用户可以输入金额和请求的值,而不是从另一个数据库位置选择它们?

基本上,我想使用它从 C# 应用程序插入/更新从我获取的 XML 文件中获取的信息。因此,我需要了解如何手动制定查询以使用此机制将解析后的数据放入数据库中。

最佳答案

如果您不熟悉join statements那么这就是你需要开始的地方。了解连接如何工作是其余部分的关键。一旦您熟悉了联接,那么通过将合并视为完整联接并包含有关如何处理匹配或不匹配的行的说明,理解合并是最容易的。

因此,使用提供的代码示例让我们查看表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> |

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

最后一点。请务必记住,不匹配默认为完整子句与目标不匹配,但是您可以就地指定与源不匹配默认子句的或附加的。 merge 语句支持两种类型的不匹配(源中的记录不在目标中,或者目标中的记录不在源中由 on 子句定义)。 You can find full documentation, restrictions, and complete syntax on MSDN.

关于t-sql - 需要 T SQL 合并示例来帮助理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10218101/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com