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;

“我尝试了不同的案例陈述,但没有成功。请帮助”让我们看看这些尝试。如果我们不知道这些尝试有什么问题,我们就无法告诉你。非常感谢拉鲁,你的回答对我帮助很大。