在这种情况下,整合数据是一个非常简单的过程。
这是一个可以在 SSMS 中运行以帮助您入门的示例。请注意,我使用的是 TABLE 变量而不是单独的数据库,但概念保持不变。
声明表(代表数据库):
DECLARE @database1 TABLE ( CustomerID NUMERIC(18,0), PropertyID INT, CustomerSurname VARCHAR(100), CustomerName VARCHAR(50), CustomerEmail VARCHAR(100) );
DECLARE @database2 TABLE ( CustomerID NUMERIC(18,0), PropertyID INT, CustomerSurname VARCHAR(100), CustomerName VARCHAR(50), CustomerEmail VARCHAR(100) );
插入您提供的示例数据:
INSERT INTO @database1 ( CustomerID, PropertyID, CustomerSurname, CustomerEmail, CustomerName )
VALUES ( 1, 1000, 'Smith', 'Adrian', 'smith@jj.com' );
INSERT INTO @database2 ( CustomerID, PropertyID, CustomerSurname, CustomerEmail, CustomerName )
VALUES ( 2, 9876, 'Smith', 'A', 'smith@jj.com' );
加入一些 SQL Server 魔法:
SELECT
ROW_NUMBER() OVER ( PARTITION BY CustomerSurname, CustomerEmail, FirstInitial ORDER BY CustomerSurname, CustomerEmail, FirstInitial ) AS ConsolidationID
, Consolidated.CustomerID
, Consolidated.PropertyID
FROM (
SELECT CustomerID, PropertyID, CustomerSurname, CustomerName, CustomerEmail, LEFT( CustomerName, 1 ) AS FirstInitial FROM @database1
UNION
SELECT CustomerID, PropertyID, CustomerSurname, CustomerName, CustomerEmail, LEFT( CustomerName, 1 ) AS FirstInitial FROM @database2
) AS Consolidated
ORDER BY
CustomerID, CustomerSurname, CustomerEmail, FirstInitial;
返回合并的结果集:
+-----------------+------------+------------+
| ConsolidationID | CustomerID | PropertyID |
+-----------------+------------+------------+
| 1 | 1 | 1000 |
| 1 | 2 | 9876 |
+-----------------+------------+------------+
使用它:
要将它与您的八个数据库一起使用,您只需将表变量(@database1、@database2 等)替换为要引用的数据库和表的完全限定名称。
SELECT {column-list} FROM MyDatabase1.dbo.TableName...
UNION
SELECT {column-list} FROM MyDatabase2.dbo.TableName...
ETC...
ROW_NUMBER()是这里真正的“魔法”。通过使用其 PARTION BY 和 ORDER BY,我们可以为与分区条件匹配的每一行获取一个“ConsolidationID”,在本例中为 CustomerSurname、CustomerEmail 和 FirstInitial。需要 ORDER BY 以确保正确排序数据,以便分区按预期工作。
需要注意的一些重要事项:
- 所有表之间的列名必须准确且顺序相同。如果需要,您可以为列名取别名。
- 当所有比较的列都相同时,使用 UNION 将排除完全重复的内容。我希望这是您在这种情况下想要的行为,但如果不是,请将UNION替换为UNION ALL以返回所有行,包括完全匹配。
- SQL Server 的ROW_NUMBER()是一个非常巧妙的功能。你可以在这里阅读更多关于它的信息。
我希望这可以帮助您上路。