如何使用结果查询更新多个表?
How to update several tables with a result query?
我正在使用 SQL Server 2017,我需要清理重复行并更新其他 table 中包含我的字段的所有行。
我有一个 table,其中包含我的客户
USERID - Username
C79784F1-7254-4195-AF7F-66E651F3C995 | Robert
3C51AD27-21F1-4751-9931-7C66263B4708 | Robert
0D67A3E3-E7CF-4D95-935D-E077F4A6D315 | Bob
70A9552A-028B-4EA0-A309-4E93EEAB92E8 | William
1D8E9F5D-FEEB-43DA-9CDA-F22D610CDE78 | William
411BCC56-A4C9-4D9B-9D49-FA9255ECA968 | William
F0223C57-E3B2-4F94-9820-2D9A62A515D6 | Cathy
CREATE TABLE [dbo].[Users]
(
[UserID] [uniqueidentifier] NOT NULL,
[UserName] [nvarchar](260) NULL
);
INSERT INTO [dbo].[Users] (userid, username)
VALUES ('C79784F1-7254-4195-AF7F-66E651F3C995','Robert');
INSERT INTO [dbo].[Users] (userid, username)
VALUES ('3C51AD27-21F1-4751-9931-7C66263B4708','Robert');
INSERT INTO [dbo].[Users] (userid, username)
VALUES ('0D67A3E3-E7CF-4D95-935D-E077F4A6D315','Bob');
INSERT INTO [dbo].[Users] (userid, username)
VALUES ('70A9552A-028B-4EA0-A309-4E93EEAB92E8','William');
INSERT INTO [dbo].[Users] (userid, username)
VALUES ('1D8E9F5D-FEEB-43DA-9CDA-F22D610CDE78','William');
INSERT INTO [dbo].[Users] (userid, username)
VALUES ('411BCC56-A4C9-4D9B-9D49-FA9255ECA968','William');
INSERT INTO [dbo].[Users] (userid, username)
VALUES ('F0223C57-E3B2-4F94-9820-2D9A62A515D6','Cathy');
然后我有 7 个 table 包含 userid
列和 1 个 table 包含另一个名称列
CreatedById - CreationDate - Folders
C79784F1-7254-4195-AF7F-66E651F3C995 | 2018-02-24 | Folder1
3C51AD27-21F1-4751-9931-7C66263B4708 | 2019-10-12 | PAD
0D67A3E3-E7CF-4D95-935D-E077F4A6D315 | 2021-05-12 | IEF
70A9552A-028B-4EA0-A309-4E93EEAB92E8 | 2021-01-27 | WIP
1D8E9F5D-FEEB-43DA-9CDA-F22D610CDE78 | 2021-06-29 | OLD_ONE
411BCC56-A4C9-4D9B-9D49-FA9255ECA968 | 2021-01-21 | ToTest
CREATE TABLE [dbo].[catalog]
(
[CreatedById] [uniqueidentifier] NOT NULL,
[CreationDate] DATE NOT NULL,
[Folders] [nvarchar](425)
);
INSERT INTO [dbo].[catalog] (CreatedById, CreationDate, Folders)
VALUES ('C79784F1-7254-4195-AF7F-66E651F3C995','2018-02-24','Folder1');
INSERT INTO [dbo].[catalog] (CreatedById, CreationDate, Folders)
VALUES ('3C51AD27-21F1-4751-9931-7C66263B4708','2019-10-12','PAD');
INSERT INTO [dbo].[catalog] (CreatedById, CreationDate, Folders)
VALUES ('0D67A3E3-E7CF-4D95-935D-E077F4A6D315','2021-05-12','IEF');
INSERT INTO [dbo].[catalog] (CreatedById, CreationDate, Folders)
VALUES ('70A9552A-028B-4EA0-A309-4E93EEAB92E8','2021-01-27','WIP');
INSERT INTO [dbo].[catalog] (CreatedById, CreationDate, Folders)
VALUES ('1D8E9F5D-FEEB-43DA-9CDA-F22D610CDE78','2021-06-29','OLD_ONE');
INSERT INTO [dbo].[catalog] (CreatedById, CreationDate, Folders)
VALUES ('411BCC56-A4C9-4D9B-9D49-FA9255ECA968','2021-01-21','ToTest');
我的另一个 table:
CREATE TABLE table3 ([USERID] [uniqueidentifier] NOT NULL);
CREATE TABLE table4 ([USERID] [uniqueidentifier] NOT NULL);
CREATE TABLE table5 ([USERID] [uniqueidentifier] NOT NULL);
CREATE TABLE table6 ([USERID] [uniqueidentifier] NOT NULL);
INSERT INTO table3 (USERID) VALUES ('C79784F1-7254-4195-AF7F-66E651F3C995');
INSERT INTO table3 (USERID) VALUES ('3C51AD27-21F1-4751-9931-7C66263B4708');
INSERT INTO table3 (USERID) VALUES ('0D67A3E3-E7CF-4D95-935D-E077F4A6D315');
INSERT INTO table3 (USERID) VALUES ('70A9552A-028B-4EA0-A309-4E93EEAB92E8');
INSERT INTO table3 (USERID) VALUES ('1D8E9F5D-FEEB-43DA-9CDA-F22D610CDE78');
INSERT INTO table3 (USERID) VALUES ('411BCC56-A4C9-4D9B-9D49-FA9255ECA968');
INSERT INTO table4 (USERID) VALUES ('C79784F1-7254-4195-AF7F-66E651F3C995');
INSERT INTO table4 (USERID) VALUES ('3C51AD27-21F1-4751-9931-7C66263B4708');
INSERT INTO table4 (USERID) VALUES ('0D67A3E3-E7CF-4D95-935D-E077F4A6D315');
INSERT INTO table4 (USERID) VALUES ('70A9552A-028B-4EA0-A309-4E93EEAB92E8');
INSERT INTO table4 (USERID) VALUES ('1D8E9F5D-FEEB-43DA-9CDA-F22D610CDE78');
INSERT INTO table4 (USERID) VALUES ('411BCC56-A4C9-4D9B-9D49-FA9255ECA968');
INSERT INTO table5 (USERID) VALUES ('C79784F1-7254-4195-AF7F-66E651F3C995');
INSERT INTO table5 (USERID) VALUES ('3C51AD27-21F1-4751-9931-7C66263B4708');
INSERT INTO table5 (USERID) VALUES ('0D67A3E3-E7CF-4D95-935D-E077F4A6D315');
INSERT INTO table5 (USERID) VALUES ('70A9552A-028B-4EA0-A309-4E93EEAB92E8');
INSERT INTO table5 (USERID) VALUES ('1D8E9F5D-FEEB-43DA-9CDA-F22D610CDE78');
INSERT INTO table5 (USERID) VALUES ('411BCC56-A4C9-4D9B-9D49-FA9255ECA968');
INSERT INTO table6 (USERID) VALUES ('C79784F1-7254-4195-AF7F-66E651F3C995');
INSERT INTO table6 (USERID) VALUES ('3C51AD27-21F1-4751-9931-7C66263B4708');
INSERT INTO table6 (USERID) VALUES ('0D67A3E3-E7CF-4D95-935D-E077F4A6D315');
INSERT INTO table6 (USERID) VALUES ('70A9552A-028B-4EA0-A309-4E93EEAB92E8');
INSERT INTO table6 (USERID) VALUES ('1D8E9F5D-FEEB-43DA-9CDA-F22D610CDE78');
INSERT INTO table6 (USERID) VALUES ('411BCC56-A4C9-4D9B-9D49-FA9255ECA968');
我想清除重复项并在数据库中只保留一条记录。
首先,我创建了一个只提供重复行并只保留一条记录的查询。
根据这条记录,我会更新table3,table4,table5,table6,
WITH singleUser AS
(
SELECT
a.UserName,
a.UserID
FROM
(SELECT
userid,
Username,
ROW_NUMBER() OVER (PARTITION BY username ORDER BY username ASC) AS rowNo,
COUNT(*) OVER (PARTITION BY username) AS c
FROM
dbo.users
WHERE
1 = 1
GROUP BY
userid, Username) a
WHERE
1 = 1
AND rowNo > 1
AND c = rowNo
)
然后我创建了一个查询,它为我提供了包含我的 'Userid' 列的所有 table。
此查询将 return: table3, table4, table5, table6
WITH tableToUpdate AS
(
SELECT
TABLE_CATALOG AS 'Bdd',
TABLE_SCHEMA AS 'Schema',
TABLE_NAME AS 'TableName',
COLUMN_NAME AS 'ColumnName'
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
1 = 1
AND CASE
WHEN COLUMN_NAME = 'CreatedByID' THEN 1
WHEN COLUMN_NAME = 'UserID' THEN 1
ELSE 0
END = 1
)
最后我创建了合并查询
MERGE INTO dbo.catalog c
USING (SELECT
u.UserID AS UserIDUsers,
su.UserID AS UserIDSingleUser
FROM
dbo.Users u
JOIN
singleUser su ON su.Username = u.username
WHERE
1 = 1) S ON c.CreatedByID = s.UserIDUsers
WHEN MATCHED THEN
UPDATE
SET c.CreatedByID =S.UserIDSingleUser
我的合并结果:
CreatedById - CreationDate - Folders
C79784F1-7254-4195-AF7F-66E651F3C995 | 2018-02-24 | Folder1
C79784F1-7254-4195-AF7F-66E651F3C995 | 2019-10-12 | PAD
0D67A3E3-E7CF-4D95-935D-E077F4A6D315 | 2021-05-12 | IEF
70A9552A-028B-4EA0-A309-4E93EEAB92E8 | 2021-01-27 | WIP
70A9552A-028B-4EA0-A309-4E93EEAB92E8 | 2021-06-29 | OLD_ONE
70A9552A-028B-4EA0-A309-4E93EEAB92E8 | 2021-01-21 | ToTest
它工作得很好,但是有没有办法让它自动化?
实际上我已经创建了 8 个查询,但只有合并部分发生了变化。
另外,在更新所有字段后,如何删除 dbo.users
table 中的重复行?
感谢您的帮助。
我回来回答我自己的问题。几天后我终于做到了。
之前我创建了一个 table 来自我的 CTE 查询 (singleUser)
CREATE OR ALTER PROCEDURE dbo.mergeUserID
AS
DECLARE @tableName nvarchar(50)
DECLARE @sql nvarchar(max)
DECLARE @columnName nvarchar(50)
BEGIN
DECLARE cursor_db CURSOR FOR
SELECT
TABLE_NAME AS 'TableName'
,COLUMN_NAME AS 'ColumnName'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE 1=1
AND CASE
WHEN COLUMN_NAME = 'CreatedByID' then 1
WHEN COLUMN_NAME = 'ModifiedByID' then 1
WHEN COLUMN_NAME = 'OwnerID'then 1
WHEN COLUMN_NAME = 'UserID' then 1
ELSE 0
END = 1
OPEN cursor_db
FETCH NEXT FROM cursor_db INTO @tableName, @columnName
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql ='MERGE INTO '
+ @tablename+ ' t USING (
SELECT
u.UserID as UserIDUsers
,su.UserID as UserIDSingleUser
FROM dbo.Users u
JOIN dbo.singleUser su on su.UserName = u.username
WHERE 1=1
)S ON t.'+@columnName+' = s.UserIDUsers
WHEN MATCHED THEN
UPDATE
SET t.'+@columnName+' = S.UserIDSingleUser;'
exec sp_executesql @sql
PRINT @sql
FETCH NEXT FROM cursor_db INTO @tableName, @columnName
END
CLOSE cursor_db
DEALLOCATE cursor_db
END;
GO
------------------------------------------------
DECLARE @RC nvarchar(max)
-- TODO: Set parameter values here.
EXECUTE @RC = [dbo].[mergeUserID]
PRINT @RC
GO
不知道写得好不好,因为第一次做。
例如,我在某些论坛上看到他们将 ;
放在 FETCH / CLOSE / DEALLOCATE ;
之后,其他人则没有。
不知道谁对谁错?
我正在使用 SQL Server 2017,我需要清理重复行并更新其他 table 中包含我的字段的所有行。
我有一个 table,其中包含我的客户
USERID - Username
C79784F1-7254-4195-AF7F-66E651F3C995 | Robert
3C51AD27-21F1-4751-9931-7C66263B4708 | Robert
0D67A3E3-E7CF-4D95-935D-E077F4A6D315 | Bob
70A9552A-028B-4EA0-A309-4E93EEAB92E8 | William
1D8E9F5D-FEEB-43DA-9CDA-F22D610CDE78 | William
411BCC56-A4C9-4D9B-9D49-FA9255ECA968 | William
F0223C57-E3B2-4F94-9820-2D9A62A515D6 | Cathy
CREATE TABLE [dbo].[Users]
(
[UserID] [uniqueidentifier] NOT NULL,
[UserName] [nvarchar](260) NULL
);
INSERT INTO [dbo].[Users] (userid, username)
VALUES ('C79784F1-7254-4195-AF7F-66E651F3C995','Robert');
INSERT INTO [dbo].[Users] (userid, username)
VALUES ('3C51AD27-21F1-4751-9931-7C66263B4708','Robert');
INSERT INTO [dbo].[Users] (userid, username)
VALUES ('0D67A3E3-E7CF-4D95-935D-E077F4A6D315','Bob');
INSERT INTO [dbo].[Users] (userid, username)
VALUES ('70A9552A-028B-4EA0-A309-4E93EEAB92E8','William');
INSERT INTO [dbo].[Users] (userid, username)
VALUES ('1D8E9F5D-FEEB-43DA-9CDA-F22D610CDE78','William');
INSERT INTO [dbo].[Users] (userid, username)
VALUES ('411BCC56-A4C9-4D9B-9D49-FA9255ECA968','William');
INSERT INTO [dbo].[Users] (userid, username)
VALUES ('F0223C57-E3B2-4F94-9820-2D9A62A515D6','Cathy');
然后我有 7 个 table 包含 userid
列和 1 个 table 包含另一个名称列
CreatedById - CreationDate - Folders
C79784F1-7254-4195-AF7F-66E651F3C995 | 2018-02-24 | Folder1
3C51AD27-21F1-4751-9931-7C66263B4708 | 2019-10-12 | PAD
0D67A3E3-E7CF-4D95-935D-E077F4A6D315 | 2021-05-12 | IEF
70A9552A-028B-4EA0-A309-4E93EEAB92E8 | 2021-01-27 | WIP
1D8E9F5D-FEEB-43DA-9CDA-F22D610CDE78 | 2021-06-29 | OLD_ONE
411BCC56-A4C9-4D9B-9D49-FA9255ECA968 | 2021-01-21 | ToTest
CREATE TABLE [dbo].[catalog]
(
[CreatedById] [uniqueidentifier] NOT NULL,
[CreationDate] DATE NOT NULL,
[Folders] [nvarchar](425)
);
INSERT INTO [dbo].[catalog] (CreatedById, CreationDate, Folders)
VALUES ('C79784F1-7254-4195-AF7F-66E651F3C995','2018-02-24','Folder1');
INSERT INTO [dbo].[catalog] (CreatedById, CreationDate, Folders)
VALUES ('3C51AD27-21F1-4751-9931-7C66263B4708','2019-10-12','PAD');
INSERT INTO [dbo].[catalog] (CreatedById, CreationDate, Folders)
VALUES ('0D67A3E3-E7CF-4D95-935D-E077F4A6D315','2021-05-12','IEF');
INSERT INTO [dbo].[catalog] (CreatedById, CreationDate, Folders)
VALUES ('70A9552A-028B-4EA0-A309-4E93EEAB92E8','2021-01-27','WIP');
INSERT INTO [dbo].[catalog] (CreatedById, CreationDate, Folders)
VALUES ('1D8E9F5D-FEEB-43DA-9CDA-F22D610CDE78','2021-06-29','OLD_ONE');
INSERT INTO [dbo].[catalog] (CreatedById, CreationDate, Folders)
VALUES ('411BCC56-A4C9-4D9B-9D49-FA9255ECA968','2021-01-21','ToTest');
我的另一个 table:
CREATE TABLE table3 ([USERID] [uniqueidentifier] NOT NULL);
CREATE TABLE table4 ([USERID] [uniqueidentifier] NOT NULL);
CREATE TABLE table5 ([USERID] [uniqueidentifier] NOT NULL);
CREATE TABLE table6 ([USERID] [uniqueidentifier] NOT NULL);
INSERT INTO table3 (USERID) VALUES ('C79784F1-7254-4195-AF7F-66E651F3C995');
INSERT INTO table3 (USERID) VALUES ('3C51AD27-21F1-4751-9931-7C66263B4708');
INSERT INTO table3 (USERID) VALUES ('0D67A3E3-E7CF-4D95-935D-E077F4A6D315');
INSERT INTO table3 (USERID) VALUES ('70A9552A-028B-4EA0-A309-4E93EEAB92E8');
INSERT INTO table3 (USERID) VALUES ('1D8E9F5D-FEEB-43DA-9CDA-F22D610CDE78');
INSERT INTO table3 (USERID) VALUES ('411BCC56-A4C9-4D9B-9D49-FA9255ECA968');
INSERT INTO table4 (USERID) VALUES ('C79784F1-7254-4195-AF7F-66E651F3C995');
INSERT INTO table4 (USERID) VALUES ('3C51AD27-21F1-4751-9931-7C66263B4708');
INSERT INTO table4 (USERID) VALUES ('0D67A3E3-E7CF-4D95-935D-E077F4A6D315');
INSERT INTO table4 (USERID) VALUES ('70A9552A-028B-4EA0-A309-4E93EEAB92E8');
INSERT INTO table4 (USERID) VALUES ('1D8E9F5D-FEEB-43DA-9CDA-F22D610CDE78');
INSERT INTO table4 (USERID) VALUES ('411BCC56-A4C9-4D9B-9D49-FA9255ECA968');
INSERT INTO table5 (USERID) VALUES ('C79784F1-7254-4195-AF7F-66E651F3C995');
INSERT INTO table5 (USERID) VALUES ('3C51AD27-21F1-4751-9931-7C66263B4708');
INSERT INTO table5 (USERID) VALUES ('0D67A3E3-E7CF-4D95-935D-E077F4A6D315');
INSERT INTO table5 (USERID) VALUES ('70A9552A-028B-4EA0-A309-4E93EEAB92E8');
INSERT INTO table5 (USERID) VALUES ('1D8E9F5D-FEEB-43DA-9CDA-F22D610CDE78');
INSERT INTO table5 (USERID) VALUES ('411BCC56-A4C9-4D9B-9D49-FA9255ECA968');
INSERT INTO table6 (USERID) VALUES ('C79784F1-7254-4195-AF7F-66E651F3C995');
INSERT INTO table6 (USERID) VALUES ('3C51AD27-21F1-4751-9931-7C66263B4708');
INSERT INTO table6 (USERID) VALUES ('0D67A3E3-E7CF-4D95-935D-E077F4A6D315');
INSERT INTO table6 (USERID) VALUES ('70A9552A-028B-4EA0-A309-4E93EEAB92E8');
INSERT INTO table6 (USERID) VALUES ('1D8E9F5D-FEEB-43DA-9CDA-F22D610CDE78');
INSERT INTO table6 (USERID) VALUES ('411BCC56-A4C9-4D9B-9D49-FA9255ECA968');
我想清除重复项并在数据库中只保留一条记录。
首先,我创建了一个只提供重复行并只保留一条记录的查询。
根据这条记录,我会更新table3,table4,table5,table6,
WITH singleUser AS
(
SELECT
a.UserName,
a.UserID
FROM
(SELECT
userid,
Username,
ROW_NUMBER() OVER (PARTITION BY username ORDER BY username ASC) AS rowNo,
COUNT(*) OVER (PARTITION BY username) AS c
FROM
dbo.users
WHERE
1 = 1
GROUP BY
userid, Username) a
WHERE
1 = 1
AND rowNo > 1
AND c = rowNo
)
然后我创建了一个查询,它为我提供了包含我的 'Userid' 列的所有 table。
此查询将 return: table3, table4, table5, table6
WITH tableToUpdate AS
(
SELECT
TABLE_CATALOG AS 'Bdd',
TABLE_SCHEMA AS 'Schema',
TABLE_NAME AS 'TableName',
COLUMN_NAME AS 'ColumnName'
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
1 = 1
AND CASE
WHEN COLUMN_NAME = 'CreatedByID' THEN 1
WHEN COLUMN_NAME = 'UserID' THEN 1
ELSE 0
END = 1
)
最后我创建了合并查询
MERGE INTO dbo.catalog c
USING (SELECT
u.UserID AS UserIDUsers,
su.UserID AS UserIDSingleUser
FROM
dbo.Users u
JOIN
singleUser su ON su.Username = u.username
WHERE
1 = 1) S ON c.CreatedByID = s.UserIDUsers
WHEN MATCHED THEN
UPDATE
SET c.CreatedByID =S.UserIDSingleUser
我的合并结果:
CreatedById - CreationDate - Folders
C79784F1-7254-4195-AF7F-66E651F3C995 | 2018-02-24 | Folder1
C79784F1-7254-4195-AF7F-66E651F3C995 | 2019-10-12 | PAD
0D67A3E3-E7CF-4D95-935D-E077F4A6D315 | 2021-05-12 | IEF
70A9552A-028B-4EA0-A309-4E93EEAB92E8 | 2021-01-27 | WIP
70A9552A-028B-4EA0-A309-4E93EEAB92E8 | 2021-06-29 | OLD_ONE
70A9552A-028B-4EA0-A309-4E93EEAB92E8 | 2021-01-21 | ToTest
它工作得很好,但是有没有办法让它自动化?
实际上我已经创建了 8 个查询,但只有合并部分发生了变化。
另外,在更新所有字段后,如何删除 dbo.users
table 中的重复行?
感谢您的帮助。
我回来回答我自己的问题。几天后我终于做到了。
之前我创建了一个 table 来自我的 CTE 查询 (singleUser)
CREATE OR ALTER PROCEDURE dbo.mergeUserID
AS
DECLARE @tableName nvarchar(50)
DECLARE @sql nvarchar(max)
DECLARE @columnName nvarchar(50)
BEGIN
DECLARE cursor_db CURSOR FOR
SELECT
TABLE_NAME AS 'TableName'
,COLUMN_NAME AS 'ColumnName'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE 1=1
AND CASE
WHEN COLUMN_NAME = 'CreatedByID' then 1
WHEN COLUMN_NAME = 'ModifiedByID' then 1
WHEN COLUMN_NAME = 'OwnerID'then 1
WHEN COLUMN_NAME = 'UserID' then 1
ELSE 0
END = 1
OPEN cursor_db
FETCH NEXT FROM cursor_db INTO @tableName, @columnName
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql ='MERGE INTO '
+ @tablename+ ' t USING (
SELECT
u.UserID as UserIDUsers
,su.UserID as UserIDSingleUser
FROM dbo.Users u
JOIN dbo.singleUser su on su.UserName = u.username
WHERE 1=1
)S ON t.'+@columnName+' = s.UserIDUsers
WHEN MATCHED THEN
UPDATE
SET t.'+@columnName+' = S.UserIDSingleUser;'
exec sp_executesql @sql
PRINT @sql
FETCH NEXT FROM cursor_db INTO @tableName, @columnName
END
CLOSE cursor_db
DEALLOCATE cursor_db
END;
GO
------------------------------------------------
DECLARE @RC nvarchar(max)
-- TODO: Set parameter values here.
EXECUTE @RC = [dbo].[mergeUserID]
PRINT @RC
GO
不知道写得好不好,因为第一次做。
例如,我在某些论坛上看到他们将 ;
放在 FETCH / CLOSE / DEALLOCATE ;
之后,其他人则没有。
不知道谁对谁错?