从两个表中删除"等效"数据

Evi*_*lDr 5 t-sql sql-server sql-server-2012

我需要在SQL Server 2012过程中执行以下伪逻辑,基于表变量和声明为这样的表:

DECLARE @tmp TABLE
    (
    ID int IDENTITY(1,1),
    UserID int NOT NULL,
    SgsID int NOT NULL
    )

CREATE TABLE #Table1
    (
    ID int IDENTITY(1,1),
    UserID int NOT NULL,
    SgsID int NOT NULL
    )
Run Code Online (Sandbox Code Playgroud)
  1. 对于表变量中的每一行数据 @tmp
  2. 删除行Table1,其中UserID/SgsID组合匹配UserID/SgsIDTable1
  3. UserID/SgsID@tmp已删除的组合中删除这些组合Table1

我一直在研究不同的方法,比如使用OUTPUT INTOINTERSECT,但是不能编写一个删除两个表的查询(实际上我认为它甚至不可能).

我已经通过使用以下代码实现了上述步骤,但是,我想知道是否有任何T-SQL专业人员可以建议更简洁/有效的方法?

有关在线版本,请参见SQLFiddle

CREATE TABLE #Table1
    (
    ID int IDENTITY(1,1),
    UserID int NOT NULL,
    SgsID int NOT NULL
    )

INSERT INTO #Table1 (UserID, SgsID) VALUES (5, 99)
INSERT INTO #Table1 (UserID, SgsID) VALUES (10, 89)
INSERT INTO #Table1 (UserID, SgsID) VALUES (150, 79)
INSERT INTO #Table1 (UserID, SgsID) VALUES (200, 69)
INSERT INTO #Table1 (UserID, SgsID) VALUES (250, 59)
SELECT * FROM #Table1 

DECLARE @tmp TABLE
    (
    ID int IDENTITY(1,1),
    UserID int NOT NULL,
    SgsID int NOT NULL
    )

INSERT INTO @tmp (UserID, SgsID) VALUES (150, 79)
INSERT INTO @tmp (UserID, SgsID) VALUES (200, 69)
INSERT INTO @tmp (UserID, SgsID) VALUES (250, 59)
INSERT INTO @tmp (UserID, SgsID) VALUES (999, 49)
SELECT * FROM @tmp

DECLARE @tbl_commonRows TABLE (UserID int, SgsID int)
INSERT INTO @tbl_commonRows 
    (
    UserID,
    SgsID
    ) 
SELECT 
    UserID,
    SgsID 
FROM
    #Table1
INTERSECT 
SELECT
    UserID,
    SgsID
FROM
    @tmp 

DELETE FROM 
    #Table1 
WHERE 
    (ID IN (
        SELECT 
            ID 
        FROM 
            #Table1 t1 INNER JOIN
            @tbl_commonRows c ON c.UserID = t1.UserID AND c.SgsID = t1.SgsID))

DELETE FROM
    @tmp
WHERE
    (ID IN (
        SELECT
            ID
        FROM
            @tmp t2 INNER JOIN
            @tbl_commonrows c ON c.UserID = t2.UserID AND c.SgsID = t2.SgsID))

SELECT * FROM #Table1 
SELECT * FROM @tmp
DROP TABLE #Table1
Run Code Online (Sandbox Code Playgroud)

ste*_*ary 1

您是否考虑过使用 MERGE 来实现此目的?可能是另一种选择,并且语法很好且易于遵循。

合并 (Transact-SQL)