插入记录然后删除旧的重复项

时间:2014-07-22 10:25:51

标签: sql sql-server tsql stored-procedures

我将数据添加到db表中,一次记录一次。添加每条记录后,我需要检查数据库中是否已存在相同的项目。虽然它们可能是该项目的多个条目,但除了参考'之外的所有列数据都是如此。每条记录可能有所不同。

到目前为止,我有以下内容;

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

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

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

因此,目的是插入记录,然后通过'名称'将所有记录组合在一起。柱。然后返回该命名项目最近输入的行的id。

假设我使用上面的代码在正确的轨道上,获取插入行的Id的最佳方法是什么,然后在delete语句中使用它?

如果,我没有朝着正确的方向前进,我们将不胜感激。

修改

我已将删除语句更改为:

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

希望现在应该做这个工作......?

3 个答案:

答案 0 :(得分:3)

如果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;

......或者其他什么东西?

答案 1 :(得分:1)

尝试以下查询:

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

编辑:您可以使用以下格式删除旧行:

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)

答案 2 :(得分:0)

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