标签: sql-merge

如何删除具有匹配 ID 且不受 MERGE 影响的行?

我有一个带有自动递增id和跨两列的唯一约束的表,keycol1并且keycol2.

假设表中有这样的数据:

H| (id, keycol1, keycol2, col1, col2)
 | (1, 'A',     'B',     'A',  'E' )
 | (2, 'A',     'C',     'J',  'K' )
 | (3, 'A',     'D',     'H',  'I' )
Run Code Online (Sandbox Code Playgroud)

然后我使用一条MERGE语句来更新对应于的所有记录keycol1

MERGE tablename trg
USING (VALUES ('A','B','C','D'),
              ('A','C','E','F'),
              ('A','E','K','F'),
              ('A','F','L','M')) src(keycol1, keycol2, col1, col2)
  ON trg.keycol = src.keycol AND trg.keycol2 = src.keycol2

WHEN MATCHED THEN
    UPDATE 
        SET col1 = src.col1, col2 = src.col2

WHEN NOT MATCHED THEN
    INSERT (keycol1, keycol2, col1, …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server sql-merge sql-delete

6
推荐指数
2
解决办法
6081
查看次数

无法终止的Oracle会话等待"来自客户端的SQL*Net消息"事件

在Oracle 11gR2上,我最近遇到了一个非常有趣的情况,涉及阻塞(但是空闲!)MERGE语句,该语句挂起"来自客户端的SQL*Net消息"事件,导致后续的,并发执行的MERGE语句在第一个语句上阻塞" cursor:pin S等待X"事件.在Oracle Enterprise Manager中,可以观察到以下内容:

在此输入图像描述

这种情况变得更加严重,因为上述Session-ID 1204无法被杀死:

alter system kill session 'sid,serial#';
alter system kill session 'sid,serial#' immediate;
Run Code Online (Sandbox Code Playgroud)

我们的DBA有时会破坏操作系统进程,但通常需要重新启动整个数据库.幸运的是,到目前为止,仅在测试系统上,从未投入生产.

注意:

我知道这可能是一个类似于这个相当含糊的问题中报告的类似问题:Oracle更新/插入卡住,DB CPU为100%,并发性高,来自客户端的SQL*Net等待消息.我还会再次报告,因为我有一个清晰的再现路径,我将作为答案报告.

sql oracle concurrency contention sql-merge

5
推荐指数
1
解决办法
1962
查看次数

SQL Server:合并语句编译错误

我在存储过程中使用了 SQL ServerMERGE语句,在编译存储过程时出现此错误:

对象引用 [dbo].[Student].[ID] 与对象定义 [dbo].[Student].[Id] 的区别仅在于大小写。

我的表结构是:

CREATE TABLE [dbo].[Student] 
(
    [Id]        INT          NOT NULL,
    [FirstName] VARCHAR (50) NULL,
    [LastName]  VARCHAR (50) NULL,
    [StateID]   INT          NULL,
    [CityID]    INT          NULL,
    [IsActive]  BIT          NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
)
Run Code Online (Sandbox Code Playgroud)

我的存储过程是:

CREATE PROCEDURE [dbo].USP_UpdateStudent
AS
    Declare @Data xml  

    SET @Data = '<?xml version="1.0" encoding="utf-16"?>
                 <Students>  
                    <Student>    
                       <ID>2</ID>    
                       <FirstName>Tridip</FirstName>    
                       <LastName>Bhattacharjee</LastName>    
                       <IsActive>true</IsActive>    
                       <StateID>2</StateID>    
                       <CityID>4</CityID>  
                    </Student>
                 </Students>'  
    BEGIN TRY
        MERGE INTO Student as Trg  
        USING (SELECT
                   d.x.value('id[1]', 'varchar(MAX)') as ID,
                   d.x.value('FirstName[1]', …
Run Code Online (Sandbox Code Playgroud)

sql-server stored-procedures sql-merge

5
推荐指数
2
解决办法
5808
查看次数

根据条件在同一个表上使用 Oracle MERGE

我创建了一个 Oracle 序列,如下所示:

CREATE SEQUENCE TASK_ID_SEQ START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE;  
Run Code Online (Sandbox Code Playgroud)

我有一个数据库表TASK如下:

TASK_ID nextval from TASK_ID_SEQ
TASK_DATE   SYSDATE
TASK_TYPE   <value fed from data>
Run Code Online (Sandbox Code Playgroud)

TASK如果中的日期TASK_TYPE尚未出现在表中,我需要插入一条新记录,否则忽略它。TASKTASK_DATE

下面的语法正确吗?

MERGE INTO TASK a
USING (SELECT b.task_date FROM TASK b) 
ON (a.task_type = b.task_type)
WHEN NOT MATCHED THEN
[INSERT INTO TASK]
Run Code Online (Sandbox Code Playgroud)

或者应该是这样:

MERGE INTO TASK a
USING (SELECT b.task_date FROM TASK b) 
ON (a.task_type = b.task_type)
WHEN MATCHED THEN
[]
WHEN MATCHED THEN
[INSERT INTO …
Run Code Online (Sandbox Code Playgroud)

sql oracle upsert oracle11g sql-merge

5
推荐指数
1
解决办法
7836
查看次数

如何在没有序列的情况下自动递增SQL Server 2016合并插入中的主键?

我正在编写一个查询来将数据从一个表导入到一个新表中.我需要插入新表中不存在的记录,并更新确实存在的记录.我正在尝试使用MERGE"upsert"方法.

由于客户端的数据库和应用程序结构,我有一些独特的问题.我插入的表有一个唯一ID字段,每个新行增加1,但表不执行自动递增; insert语句需要拉出目标表中的最高ID,并为新记录添加1.

根据我的研究,我无法弄清楚如何用MERGE做到这一点.我没有数据库权限来创建序列.我尝试了很多东西,但目前我的查询看起来像:

MERGE
    dbo.targetTable as target
USING
    dbo.sourceTable AS source
ON
    target.account_no = source.account_ID

WHEN NOT MATCHED THEN
    INSERT (
        ID,
        FIELD1,
        FIELD2,
        FIELD3
) VALUES (
        (SELECT MAX(ID) + 1 FROM dbo.targetTable),
        'field1',
        'field2',
        'field3'
)
Run Code Online (Sandbox Code Playgroud)

我遇到这个代码的问题是它似乎只运行一次新ID的select语句.也就是说,如果目标表中的最高ID是10,它将插入ID为11的每个新记录.这将无法正常工作,因为我收到 Violation of PRIMARY KEY constraint. Cannot insert duplicate key in object错误.我一直在做大量的谷歌搜索和尝试不同的东西,但无法弄清楚这一点.感谢任何帮助,谢谢.

编辑:为了澄清,唯一ID列不会自动填充.如果我没有为ID列插入值,我得到 Cannot insert the value NULL into column 'ID', table 'dbo.targetTable'; column does not allow nulls. UPDATE fails.

而且,正如我最初提到的,我没有创建序列的权限.它只是抛出一个错误,并说我没有这样做的许可.

我同意将ID列自动更改为自动增量是完美的,但我没有能力像这样修改表格.

sql sql-server primary-key sql-merge sql-server-2016

5
推荐指数
1
解决办法
571
查看次数

4
推荐指数
1
解决办法
5416
查看次数

如何更正将带有“ NOT MATCHED BY TARGET ”的 MERGE 语句从 MS SQL 迁移到 PostgreSQL?

我有这样的sql语句:

MERGE pvl.testTable AS T
USING temp.testTable AS S
ON (T.Id = S.ID)
WHEN NOT MATCHED BY TARGET THEN
  INSERT (first,
          second,
          third,
          fourth) VALUES (s.first,
                          s.second,
                          s.third,
                          s.fourth)
WHEN MATCHED
THEN
  UPDATE
  SET
    T.first  = S.first,
    T.second = S.second,
    T.third  = S.third,
    T.fourth = S.fourth
WHEN NOT MATCHED BY SOURCE
THEN
  DELETE;
Run Code Online (Sandbox Code Playgroud)

我也知道我必须使用 ON CONFLICT,但是我如何处理“WHEN NOT MATCHED BY TARGET”和“WHEN NOT MATCHED BY SOURCE”?

sql-server postgresql sql-merge

4
推荐指数
1
解决办法
1743
查看次数

目标表上的合并语句和后触发器

我在目标表上有两个后触发器(一个用于插入,一个用于更新).现在,如果我在目标表上执行merge,则触发器只执行一次.虽然merge语句执行大约300次更新和200次插入.

在从删除的,插入的记录到变量的数据之后,我在每个触发器中使用print语句检查它.

怎么会?这是一个错误吗?

我有SQL Server 2008 sp1 std(SBS2k8的一部分).

sql sql-server-2008 sql-merge

3
推荐指数
1
解决办法
2802
查看次数

在TSQL-Merge中匹配条件时更新和插入

我一直在尝试编写一个存储过程,我可以使用Merge和以下条件执行UpSert

  1. 如果记录存在,则将目标的EndDate更改为昨天的日期,即当前日期 - 1

  2. 如果Record不存在,则插入新记录

这是我在SP中使用的表tblEmployee

CREATE TABLE tblEmployee
(
    [EmployeeID] [int] IDENTITY(1,1) NOT NULL, 
    [Name] [varchar](10) NOT NULL,  
    [StartDate] [date] NOT NULL,
    [EndDate] [date] NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

这是我的SP,它将UDTT作为输入参数

CREATE PROCEDURE [dbo].[usp_UpsertEmployees]
@typeEmployee typeEmployee READONLY -- It has same column like tblEmployye except EmployeeID
AS
BEGIN
    SET NOCOUNT ON;      

    MERGE INTO tblEmployee AS TARGET
    USING @typeEmployee AS SOURCE
    ON TARGET.Name = SOURCE.Name 

    WHEN MATCHED and TARGET.StartDate < SOURCE.StartDate
    THEN 

            --First Update Existing Record EndDate to Previous Date as shown below …
Run Code Online (Sandbox Code Playgroud)

sql-server stored-procedures sql-merge sql-server-2014

3
推荐指数
1
解决办法
1万
查看次数

JdbcTemplate-使用SQL MERGE插入或更新Oracle BLOB

使用JdbcTemplate,我想调用MERGE SQL语句,该语句将向表中插入新记录,或者如果已经存在具有特定键的行,则更新该语句。关键部分是该列之一是Oracle BLOB类型。

这是我到目前为止尝试过的:

尝试1。

SQL语句:

    String sql = ""
            + "MERGE INTO file_thumbnails "
            + "     USING (SELECT ? as file_c_id, ? as thumbnail_type, ? as thumbnail_image FROM DUAL) tmp "
            + "        ON (file_thumbnails.file_c_id = tmp.file_c_id AND "
            + "            file_thumbnails.thumbnail_type = tmp.thumbnail_type) "
            + "      WHEN MATCHED THEN "
            + "        UPDATE "
            + "           SET thumbnail_image = tmp.thumbnail_image "
            + "              ,thumbnail_date = SYSDATE "
            + "      WHEN NOT MATCHED THEN "
            + "        INSERT (c_id, …
Run Code Online (Sandbox Code Playgroud)

oracle spring blob jdbctemplate sql-merge

3
推荐指数
1
解决办法
4274
查看次数