SQL Server 插入记录,然后删除较旧的重复项

7d7tgy0s  于 2022-11-21  发布在  其他
关注(0)|答案(3)|浏览(178)

我正在向数据库表中添加数据,每次添加一条记录。添加每条记录后,我需要检查数据库中是否已存在相同的项目。虽然项目可能有多个条目,但每条记录中除“引用”之外的所有列数据可能都不同。
到目前为止我有以下几点:

CREATE PROCEDURE [dbo].[insertAcListingsAircraftData]
....
AS

INSERT INTO tblRes (....)
VALUES (.....)

DELETE FROM tblRes 
WHERE Id NOT IN
(
    SELECT MAX(Id)
    FROM tblRes 
    GROUP BY reference
)

因此,目标是插入记录,然后通过“name”列将所有记录分组在一起,然后返回最近输入的命名项的行的id。
假设我对上面的代码的理解是正确的,那么获取插入行的Id,然后在delete语句中使用它的最佳方法是什么?
我走的方向对吗?

编辑

我已经将delete语句更改为:

DELETE FROM tblRes 
WHERE SCOPE_IDENTITY NOT IN
(
    SELECT MAX(Id)
    FROM tblRes 
    GROUP BY reference
)

现在这个能解决问题吗?

w80xi6nr

w80xi6nr1#

如果 ID 列 是 一 个 标识 , 则 可以 使用@@IDENTITY 返回 最 后 插入 的 行 的 ID 。 例如 :

CREATE TABLE #MyTable (PK INT IDENTITY(1,1), SomeValue VARCHAR(50));
INSERT INTO #MyTable (SomeValue) SELECT 'xxx';
SELECT @@IDENTITY;
INSERT INTO #MyTable (SomeValue) SELECT 'yyy';
SELECT @@IDENTITY;

中 的 每 一 个
返回 1 , 然后 返回 2 。
因此 , 在 您 的 原始 存根 中 使用 以下 代码 :

CREATE PROCEDURE [dbo].[insertAcListingsAircraftData]
....
AS

INSERT INTO tblRes (....)
VALUES (.....)

DECLARE @Id INT;
SELECT @Id = @@IDENTITY;
DECLARE @Reference NVARCHAR(MAX); --or whatever data type it is
SELECT @Reference = Reference FROM tblRes WHERE Id = @Id;    

DELETE FROM tblRes 
WHERE Reference = @Reference 
AND Id != @Id;

格式
... ... 或者 类似 的 东西 ?

gj3fmq9x

gj3fmq9x2#

请尝试以下查询:

DELETE z
FROM (
    SELECT *,ROW_NUMBER() OVER (PARTITION BY name ORDER BY Id DESC)row
    FROM yourtable
    )z
WHERE z.rowr<>1

EDIT:您可以使用以下格式删除较旧的行:

CREATE PROCEDURE [dbo].[insertAcListingsAircraftData]
....
AS

DECLARE @T TABLE(Id int)

INSERT INTO tblRes (....)
OUTPUT INSERTED.Id INTO @T
VALUES (.....)

DELETE FROM tblRes 
WHERE name= @name
  and Id NOT IN(SELECT Id FROM @T)
elcex8rz

elcex8rz3#

DELETE FROM tblRes 
WHERE SCOPE_IDENTITY NOT IN
(
    SELECT MAX(Id)
    FROM tblRes 
    GROUP BY reference
)

相关问题