Sql server 根据条件在SQL Server表中更新或删除
我有一个名为Sql server 根据条件在SQL Server表中更新或删除,sql-server,Sql Server,我有一个名为MainTable的SQL Server表,我想通过将其连接到名为LKP的查找表来对其执行两种不同的操作(删除或更新) MainTable LKP ID OldID NewID ------ --------------- 101 101 103 102 102
MainTable
的SQL Server表,我想通过将其连接到名为LKP
的查找表来对其执行两种不同的操作(删除或更新)
MainTable LKP
ID OldID NewID
------ ---------------
101 101 103
102 102 104
103
我使用ID=OldID
上的LKP
加入main表,以获得每个ID的NewID
删除场景
当NewID
已在MainTable
中时,请删除MainTable
中的ID
例如,101的NewID
是103,并且103已经在MainTable
中,因此从MainTable
中删除101
更新场景
当NewID
不在main表中时
,则用NewID更新ID
例如,102的NewID
为104,而104不在main表中,因此将102更新为104
最后,main表应如下所示:
ID
----
104
103
我尝试了不同的案例陈述,但没有成功。请帮助您可以尝试此(如果存在)
检查表中是否已有数据。根据结果,您可以执行进一步的操作Update
或delete
Create procedure uspUpdateDel
@Id int
as
Begin
if exists (Select 1 from maintable join LKP on ID = OldID where id = @Id)
begin
Delete from Maintable where id = @Id
end
else
begin
update Maintable set id = ... where ...
end
End
除上述内容外,您还可以使用检查并返回任何特定SQL Server语句所涉及或影响的行数,如下所示,并相应地执行操作
USE AdventureWorks2012;
GO
UPDATE HumanResources.Employee
SET JobTitle = N'Executive'
WHERE NationalIDNumber = 123456789
IF @@ROWCOUNT = 0
PRINT 'Warning: No rows were updated';
ELSE
PRINT 'Warning: Some rows were updated';
GO
您需要在这里执行2个DML语句;1删除
和1更新
。由于DELETE
似乎具有“更高的优先级”,因此我将其放在第一位。否则,这将删除更新为ID
的103
值的行:
CREATE TABLE dbo.MainTable (ID int);
INSERT INTO dbo.MainTable (ID)
VALUES (101),
(102),
(103);
GO
CREATE TABLE dbo.LKP (OldID int,
[NewID] int);
INSERT INTO dbo.LKP (OldID,
[NewID]) --NEWID is a function's name, I suggest a different name
VALUES (101, 103),
(102, 104);
GO
DELETE MT
FROM dbo.MainTable MT
JOIN dbo.LKP L ON MT.ID = L.[NewID];
UPDATE MT
SET ID = L.NewID
FROM dbo.MainTable MT
JOIN dbo.LKP L ON MT.ID = L.OldID;
GO
SELECT *
FROM dbo.MainTable;
GO
DROP TABLE dbo.MainTable;
DROP TABLE dbo.LKP;
您应该在LKP表上使用光标。。。并根据条件在主表上执行正确的操作。像这样
Declare
@oldID int,
@newID int;
Declare ids CURSOR
FOR Select
OldID,
NewID
From
LKP;
Open ids;
Fetch Next From ids Into @oldID, @newID;
While @@FETCH_STATUS = 0
Begin
if exists (Select 1 from MainTable where id = @newID)
begin
Delete from MainTable where id = @oldID
end
else
begin
update MainTable set id = @newID where id = @oldID;
end;
Fetch Next From ids Into @oldID, @newID;
End;
Close ids;
Deallocate ids;
“我尝试了不同的案例陈述,但没有成功。请帮助”让我们看看这些尝试。如果我们不知道这些尝试有什么问题,我们就无法告诉你。非常感谢拉鲁,你的回答对我帮助很大。