我将数据添加到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
)
希望现在应该做这个工作......?
答案 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
)