问题标签 [sql-merge]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
6 回答
578 浏览

sql - DBMS 级别的管道和过滤器:拆分 MERGE 输出流

设想

我们有一个非常标准的数据导入过程,在该过程中我们加载一个 staging表,然后MERGE将其放入一个target表中。

新要求(绿色)涉及将导入数据的子集捕获到单独的queue表中以进行完全不相关的处理。

场景架构

“挑战”

(1) 子集由选择的记录组成:仅新插入到target表中的记录。

(2) 子集是一些插入列的投影,但也是至少一个仅存在于源(staging 表)中的列。

(3)MERGE语句已经OUTPUT..INTO严格使用子句来记录$actionstake by MERGE,以便我们可以 统计PIVOT结果和COUNT插入、更新和删除的次数。我们真的不喜欢像那样缓冲整个数据集的动作,而是更喜欢动态聚合总和。不用说,我们不想向该OUTPUT表添加更多数据。

MERGE (4)无论出于何种原因,我们都不想执行第二次执行的匹配工作,即使是部分执行。表 target真的很大,我们不能索引所有的东西,而且操作通常相当昂贵(分钟,而不是秒)。

(5) 我们不考虑将任何输出从MERGE到客户端,以便客户端可以queue通过立即将其发送回来将其路由到 。数据必须保留在服务器上。

(6) 我们希望避免将整个数据集缓冲在 和 之间staging的临时存储中queue

最好的方法是什么?

失败

(a) 仅将插入的记录排入队列的要求使我们无法queue直接在 的OUTPUT..INTO子句中定位表MERGE,因为它不允许任何WHERE子句。我们可以使用一些 CASE技巧来标记不需要的记录,以便后续删除queue而不进行处理,但这似乎很疯狂。

(b) 因为某些用于 的列queue没有出现在 target表中,我们不能简单地在目标表上添加插入触发器来加载queue. “数据流拆分”必须尽快发生。

(c) 由于我们已经在 中使用了一个OUTPUT..INTO子句MERGE,我们也不能添加第二个OUTPUT子句并将嵌套MERGE到 an INSERT..SELECT中来加载队列。这是一种耻辱,因为对于原本效果很好的东西来说,这感觉像是一个完全任意的限制;SELECT过滤器只过滤 $action我们想要的记录 ( )INSERT并将INSERT它们放在queue单个语句中。因此,DBMS 理论上可以避免缓冲整个数据集,而是简单地将其流式传输到queue. (注:我们没有追求,很可能它实际上并没有这样优化计划。)

情况

我们觉得我们已经用尽了我们的选择,但还是决定求助于主脑来确定。我们能想到的只有:

(S1) 创建一个表,VIEWtarget表还包含用于queue唯一数据的可为空列,并让 SELECT语句将它们定义为NULL。然后,设置INSTEAD OF 填充target表和queue 适当的触发器。最后,连接MERGE到目标视图。这行得通,但我们不是该构造的粉丝——它 看起来确实很棘手。

(S2) 放弃,使用另一个将整个数据集缓冲在一个临时表中MERGE..OUTPUT。之后MERGE,立即将临时表中的数据(再次!)复制到queue.

0 投票
2 回答
1281 浏览

sql - oracle中的合并语句问题

我来自 Microsoft SQL 环境。我有两个表tak_ne,如果值不存在,我的要求是从totak_beb插入值,如果存在则更新。所以我做了一个合并语句,如下所示。面临的是非常天 50000 计数正在增加序列号。Oracle 是稳定的数据库,我不知道他们为什么这样做。所以我创建了一个函数并阻止增加序列号。我的问题是,这是一个正确的方法通过创建函数。以下是我所做的tak_bebtak_ne

然后我创建了一个函数

0 投票
3 回答
723 浏览

sql - 更新违反主键

更新到数据库时,我的更新收到以下错误:

ORA-00001: 违反了唯一约束 (DONALDBURY.BARS_ID_PK)

我正在使用以下代码作为我的更新。我不想摆脱约束,而是想找到一种解决方法。我想停止设置重复值。

0 投票
2 回答
4207 浏览

sql-server - SQL Server:合并语句编译错误

MERGE在存储过程中使用了 SQL Server 语句,并且在编译存储过程时出现此错误:

对象引用 [dbo].[Student].[ID] 仅在大小写上与对象定义 [dbo].[Student].[Id] 不同。

我的表结构是:

我的存储过程是:

我的错误是什么导致了这个错误?谢谢

编辑

通过 SSMS 和 LinqPad 获得了 2 个连接 sql compact db 的良好链接。链接在这里

https://stackoverflow.com/a/16692386/728750 https://dba.stackexchange.com/questions/47534/how-do-i-view-a-microsoft-sql-server-compact-database

谢谢

0 投票
1 回答
809 浏览

sql - 如何在 MERGE MATCHED WHEN CASE Oracle 中初始化变量

我是 PL/SQL 合并命令的新手。谁能帮我。我想在 ORACLE 的 MEGE 查询的 Match THEN Case 中添加新记录 MERGE MATCHED THEN 案例或初始化新变量。

我收到以下错误:

ORA-06550:第 91 行,第 10 列:PL/SQL:ORA-00905:尝试添加新记录或初始化新变量时缺少关键字

请任何人帮助我。

0 投票
1 回答
1433 浏览

sql - 使用 hsqldb 了解 MERGE INTO

我有一个空表,如果它不存在,我想插入一些行。我尝试了 3 种(主要)语句变体。第一个有效,第二个没有错误但不插入任何内容,第三个甚至抛出错误。

我想了解为什么第二个语句没有做任何事情。

首先是(插入):

其次是(不插入):

如果 SELECT 什么都不返回,那么 NOT MATCHED 语句应该触发,对吗?

第三是(有错误):

最后一个版本的灵感来自https://stackoverflow.com/a/30938729/4142984,它适用于 sql-server,而不适用于 hsqldb。

0 投票
1 回答
153 浏览

c# - 合并语句问题(主要用于更新) incase 块

我试图将某些数据从一个表(table1)插入另一个表(table2),就像数据是否存在一样,只需更新数据或插入数据。但我现在面临的问题是,当我添加最后一个条件时如果 first_name like 'mss%' 我必须插入 SERVICE_TYPE_ID 10 否则 20。但是对于这种情况并没有发生这种情况,并且所有情况都成功。所以我想知道最后一种情况有什么问题

这主要是合并更新部分失败并插入 20 而不是 10 这是我的完整 oracle 查询

除了指出的情况外,所有情况条件都是成功的trim(b.first_name) like 'mss%'

0 投票
0 回答
76 浏览

sql - 合并来自具有慢速连接的不同 SQL Server 的两个表的值

我有两个(链接的)Microsoft SQL 服务器,它们的设置基本相同,但它们的内容不同。与服务器的连接很慢。有些表包含很多行。某些记录在字段中有所不同。每台服务器上的数据匹配率为 99%

我需要以最少的流量传输将数据从一台服务器合并到另一台服务器

例如:

我可以:

  1. 删除 SERV2.DB2.dbo.Table 并从备份 SERV1.DB1.dbo.Table 恢复到 SERV2

加:简单

减号:大型数据库速度慢

  1. 使用 JOIN\UPDATE\INSERT 或 MERGE\UPDATE\INSERT 构造与露营每个字段

加:简单

减号:大桌子慢

减:大量数据传输

  1. 使用所有字段在每行上添加和计算 HASH 列,然后使用 MERGE\UPDATE\INSERT 仅更新差异行

加:只传输所有行的哈希值和更新行

减号:更改表

减:计算

减号:很多桌子需要做更多的工作

  1. 使用 tablediff 实用程序

正负: ???在这种情况下有用吗?它是如何与慢速连接一起工作的?

有没有更有用的方法可以以最少的流量传输将数据从一台服务器合并到另一台服务器?

UPD:慢速连接通道是优化流量的原因。对于具有大量记录的表,比较两个表中的每条记录或复制完整的表\数据库将花费大量时间。

0 投票
2 回答
221 浏览

sql - 合并另一个表中的数据时违反主键

我有两个表,TBTC03 和 TBTC03Y,其中 TBTC03Y 有两个额外的列作为 EFFDTE 和 EXPDTE。我必须使用以下逻辑将数据从 TBTC03 合并到 TBTC03Y:

如果在 TC03Y 中找不到匹配的 TC03 条目,则
使用 TC03 数据构建新的 TC03Y 记录
,生效日期将默认为“01-01-1980”
,到期日期将默认为“09-30-1995”

我写了一个与以下内容相同的查询:

这两个表的主键是 LOB、MAJPERIL 和 LOSSCAUSE。

但是我有一些 TBTC03Y 记录,这些记录已经包含带有主键的数据。

触发上述查询会在某些行上提供主键约束。我无法弄清楚我该如何完成它。

0 投票
1 回答
63 浏览

sql-server - 当条件匹配新插入的记录时,T-Sql MERGE 语句更新

这是我拥有的 XML:

这是将这些数据插入或更新到单个表中的 MERGE 语句:

当表中没有记录时,我期望的是第一条 xml 记录将被插入,第二条 xml 记录将被插入,第三条 xml 记录将更新第一个表记录,因为它符合条件。实际发生的是我得到 3 个插入而不是 2 个插入和 1 个更新。

结果截图:在此处输入图像描述

有没有办法在每次插入或更新后强制 MERGE 语句执行 COMMIT 或其他操作?我不想对 xml 记录进行分组或选择最大/最后一个。

更新:

我使用了一个类似于第一个的合并操作。唯一的区别是这个连接了值。

预期的结果应该是: