簡體   English   中英

SQL整合數據最佳策略

[英]SQL consolidating data best Strategy

我正在使用SQL Server 2005。

我在同一SQL Server中有8個數據庫。 每個數據庫(屬性)中都有一個包含數千個客戶的表。

簡單起見

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

到現在為止,每個屬性都分別填充其客戶。 現在,需要合並客戶以進行報告。

我想在所有數據庫中找到所有普通客戶

(條件=客戶姓氏+客戶電子郵件+客戶名稱的首字母)

並填充一個新表(合並),該表包含每個普通客戶的屬性數據庫的PropertyID和CustomerID。

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

想象:物業1的顧客

1000 1 Smith Adrian smith@jj.com

物業客戶2

9876 2 Smith A smith@jj.com

合並表

1 1 1000
1 2 9876

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

我很困惑如何使用8個數據庫之間的條件找到共同的客戶。實現這一目標的策略。

在這種情況下,整合數據是非常簡單的過程。

這是您可以在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 ALL替換UNION以返回所有行,包括精確匹配。
  3. SQL Server的ROW_NUMBER()是一個非常漂亮的功能。 您可以在此處了解更多信息。

我希望這有助於您前進。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM