以下に示すように、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
があり、テーブル名が含まれています。私の場合は、以下に示すように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_FName
およびEmp_LName
が他のテーブルと一致する場合は、重複した行を削除し、元の行をそのまま維持する必要があります。
私の例ではEmp_FName
、削除する必要のあるテーブルで繰り返されるand 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つ以上になる可能性があります。
このクエリはそれを削除します(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]
コメントを追加