SQL Server 2008 R2:从多个表中删除重复的行并保留原始行

时间:2015-08-19 05:29:07

标签: sql-server sql-server-2008-r2

我有5个员工表,如下所示。

---Table: Emp_1
CREATE TABLE Emp_1 
(
    Emp_ID VARCHAR(10),
    Emp_FName VARCHAR(10),
    Emp_LName VARCHAR(10),
    Emp_PNumber VARCHAR(10)
);

---Table: Emp_2
CREATE TABLE Emp_2
(
    Emp_ID VARCHAR(10),
    Emp_FName VARCHAR(10),
    Emp_LName VARCHAR(10),
    Emp_PNumber VARCHAR(10)
);

---Table: Emp_3
CREATE TABLE Emp_3 
(
    Emp_ID VARCHAR(10),
    Emp_FName VARCHAR(10),
    Emp_LName VARCHAR(10),
    Emp_PNumber VARCHAR(10)
);

---Table: Emp_4
CREATE TABLE Emp_4 
(
    Emp_ID VARCHAR(10),
    Emp_FName VARCHAR(10),
    Emp_LName VARCHAR(10),
    Emp_PNumber VARCHAR(10)
);

---Table: Emp_5
CREATE TABLE Emp_5
(
    Emp_ID VARCHAR(10),
    Emp_FName VARCHAR(10),
    Emp_LName VARCHAR(10),
    Emp_PNumber VARCHAR(10)
);

--Insertion: Emp_1
INSERT INTO Emp_1 VALUES('A1','Abram','Mak','123');
INSERT INTO Emp_1 VALUES('A2','Sam','William','321');

--Insertion: Emp_2
INSERT INTO Emp_2 VALUES('A3','John','Marsh','456');
INSERT INTO Emp_2 VALUES('A4','Tom','Lee','654');

--Insertion: Emp_3
INSERT INTO Emp_3 VALUES('A5','Abram','Mak','789');
INSERT INTO Emp_3 VALUES('A6','Shawn','Meben','987');

--Insertion: Emp_4
INSERT INTO Emp_4 VALUES('A7','Sam','William','189');
INSERT INTO Emp_4 VALUES('A8','Mark','Boucher','287');

--Insertion: Emp_5
INSERT INTO Emp_5 VALUES('A9','Gery','Joy','907');
INSERT INTO Emp_5 VALUES('A10','Anthony','Desosa','977');

现在我将每个表名插入到Container表中。 我有一个名为Container的下表,其中包含表名,我的名字可能很多 case我刚插入了5,如下所示。

--Table : Container
CREATE TABLE Container
(
    TableName VARCHAR(50)
);

--Insertion
INSERT INTO Container VALUES('Emp_1');
INSERT INTO Container VALUES('Emp_2');
INSERT INTO Container VALUES('Emp_3'); 
INSERT INTO Container VALUES('Emp_4');
INSERT INTO Container VALUES('Emp_5');

注意:现在我想从每个表中删除重复的行,并希望保持原始状态不变。 删除重复行的条件是:

如果Emp_FNameEmp_LName与其他表匹配,则必须删除重复的行并且 原始行保持不变。

在我的示例中,表Emp_FName中重复的Emp_LName'Abram','Mak'Emp_3必须删除且原始 表Emp_1中存在的一个保持不变。

Emp_FName中重复的Emp_LName'Sam','William'Emp_4必须删除并且原始 表Emp_1中存在的一个保持不变。

对于单个表:对于单个表,我可以使用以下脚本删除重复的表并保留原始表。

;WITH CTE AS
(
      SELECT  *,ROW_NUMBER() OVER (PARTITION BY Emp_FName,Emp_LName ORDER BY Emp_FName) Row_Number FROM Emp_1
)
DELETE FROM CTE
WHERE  Row_Number > 1;

我的问题是如何删除多个表中的重复行,这些表是动态的,我的意思是在我的Container表中表 也可能超过5个。

1 个答案:

答案 0 :(得分:1)

此查询将删除它(emp1> emp2 ...> emp5):

Declare @sql nvarchar(max) = ''

Select @sql = coalesce(@sql, '')+ '
Delete d From ['+c2.TableName+'] as d
    Inner join ['+c1.TableName+'] as c on c.Emp_FName = d.Emp_FName and c.Emp_LName = d.Emp_LName; 
    '
From Container as c1
Inner Join Container as c2 On c2.TableName > c1.TableName
Order By c1.TableName, c2.TableName

Print @sql
EXEC sp_executesql @sql

但是,我认为您应该花些时间考虑一下您的系统和数据模型,并尝试在不使用动态查询的情况下找到更好的方法。