SQL整合数据最佳策略

时间:2018-07-20 20:04:29

标签: sql sql-server consolidation

我正在使用SQL Server 2005。

我在同一SQL Server中有8个数据库。 每个数据库(属性)中都有一个包含数千个客户的表。

简单起见

function kmlPlClick(pm, doc)

直到现在,每个媒体资源分别填充其客户。现在有必要合并客户以进行报告。

我想在所有数据库中找到所有普通客户

  

(条件=客户姓氏+客户电子邮件+客户的首字母   名称)

并为每个普通客户填充一个新表(合并),该表包含Property数据库的PropertyID和CustomerID。

CustomerID      numeric(18,0)
PropertyID      int
CustomerSurname varchar(100)
CustomerName    varchar(50)
CustomerEmail   varchar(100)

想象: 物业1的客户

ConsolidationID numeric(18,0)
PropertyID      int
CustomerID      numeric(18,0)

物业2的客户

1000 1 Smith Adrian smith@jj.com

合并表

9876 2 Smith A smith@jj.com

因此,在合并表中,我们有Smith的ID = 1,Smith在Database1(属性)中具有本地ID 1000,在Database2(属性)中具有localID 9876

我对于如何使用8个数据库之间的条件找到共同的客户感到困惑,实现这一目标的策略。

1 个答案:

答案 0 :(得分:2)

在这种情况下,整合数据是非常简单的过程。

这是您可以在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...

等等...

ROW_NUMBER()是真正的“魔术”。通过使用其PARTION BY和ORDER BY,我们可以为与分区条件匹配的每一行(在这种情况下为CustomerSurname,CustomerEmail和FirstInitial)获得一个“ ConsolidationID”。必须使用ORDER BY才能确保正确排序数据,以便分区能够按预期工作。

一些重要的注意事项:

  1. 所有表之间的列名必须相同且顺序相同。您可以 别名列名称(如果需要)。
  2. 在所有比较的列中,使用UNION将排除完全重复的项 是相同的。我希望这是您在这种情况下想要的行为, 但是,如果不是,请将 UNION 替换为 UNION ALL 以返回所有行, 包括完全匹配。
  3. SQL Server的 ROW_NUMBER()是一个非常漂亮的功能。你可以阅读 进一步了解here

我希望这可以帮助您上路。