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其中包含表名,就我而言,我可能插入了许多表名,如下所示。

--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_FNameand Emp_LName'Abram','Mak'重复项Emp_3必须删除,而表中存在的原始项Emp_1保持原样。

并且Emp_FNameEmp_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个。

朱利安·瓦瓦瑟(Julien Vavasseur)

此查询将删除它(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

但是,我认为您应该花一些时间来考虑系统和数据模型,并尝试找到一种更好的方式来实现,而无需使用动态查询。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

连接行值SQL Server 2008 R2

来自分类Dev

在SQL Server 2008 R2中查询复杂的XML

来自分类Dev

SQL Server 2008中的减法

来自分类Dev

替换SQL Server 2008 R2中的游标

来自分类Dev

SQL Server 2008 R2中奇怪的CAST()行为

来自分类Dev

SQL Server 2008 R2中的NULL相等

来自分类Dev

SQL Server 2008中的递归

来自分类Dev

如何使用SQL查询在SQL SERVER 2008 R2中获得表定义?

来自分类Dev

如何使用递归逻辑仅返回sql表中的Root行(SQL Server 2008 R2)

来自分类Dev

SQL Server 2008中的SQL FIFO逻辑

来自分类Dev

从2008 R2创建SQL Server 2008备份

来自分类Dev

如何删除SQL Server 2008 R2中所有行中只有一个值的多列

来自分类Dev

如何在Sql Server 2008 R2中将列转换为行?

来自分类Dev

SQL Server 2008 R2中的字符组合后删除文本

来自分类Dev

在SQL Server 2008 R2的列中的数字后删除字符

来自分类Dev

在SQL Server 2008中删除重复项

来自分类Dev

无法在SQL Server 2008 R2中设置条件

来自分类Dev

在SQL Server 2008中订购

来自分类Dev

SQL Server 2008 R2:数据透视表

来自分类Dev

在SQL Server 2008 R2中插入几何值

来自分类Dev

在SQL Server 2008中列为行

来自分类Dev

从SQL Server 2008 R2中的实际数据库表中删除非重复行

来自分类Dev

SQL Server 2008中的自动行删除

来自分类Dev

在SQL Server 2008中透视多个列

来自分类Dev

SQL Server 2008中的SQL FIFO逻辑

来自分类Dev

Microsoft SQL Server 2008 R2删除回车

来自分类Dev

SQL Server 2008保留表中的行以及其他表中的不匹配值

来自分类Dev

删除分区 SQL Server 2008

来自分类Dev

如何在 SQL Server 2008 R2 的列中查找重复值?