2013-02-14 30 views
0

我在我們的環境SCCM,McAfee EPO和ActiveDirectory中爲特定計算機名稱的「用戶名」字段查詢3個不同的數據庫(總共4個字段)。邏輯上合併4列的相同信息

四列SCCM_TOP,SCCM_LAST,EPO,AD

一些元組,我得到的是這樣的:

JOE, JOE, ADMINISTRATOR, JOE 

or 
JOE, SARAH, JOE, JOE 

or 
NULL, NULL, JOE, JOE 

or 
NULL, NULL, JOE, SARAH 

最後一個例子是最難打擊的代碼。

我正在編寫一個CASE語句,以幫助合併信息的方式給出一個 「最佳猜測」的最後一列。目前,我正在根據來自每個數據庫的另一列(「記錄的年齡」)來衡量最有效的用戶名。

CASE 
WHEN ePO_Age <= CT_AGE AND NOT ePO_UN IS NULL THEN ePO_UN 
WHEN NOT (SCCM_AGE) IS NULL AND NOT (SCCM_LAST_UN) IS NULL THEN SCCM_LAST_UN 
WHEN NOT (SCCM_AGE) IS NULL AND NOT (SCCM_TOP_UN) IS NULL THEN SCCM_TOP_UN 
WHEN NOT (AD_UN) IS NULL THEN AD_UN 
ELSE NULL 
END     AS BestName, 

但是必須有更好的方法將這些記錄合併爲一個。我的下一步是衡量「平均年齡」,然後從那裏選擇用戶名,放棄「管理員」。

任何想法或訣竅?

回答

0

如果您只想獲取最近的非空的UserName,請嘗試使用UNION來合併每個表的結果。

SELECT TOP 1 qry.UserName 
FROM(
    SELECT UserName, CreateDate 
    FROM UserNames_1 
    UNION ALL 
    SELECT UserName, CreateDate 
    FROM UserNames_2 
    UNION ALL 
    SELECT UserName, CreateDate 
    FROM UserNames_3 
) AS qry 
WHERE qry.UserName IS NOT NULL 
ORDER BY qry.CreateDate DESC 

有一個SQL Fiddle

1

你可以從COALESCE功能中獲益一點拿到的第一個非NULL值,這樣做:

COALESCE(CASE WHEN ePO_Age<=CT_AGE THEN ePO_UN END, 
     CASE WHEN SCCM_AGE IS NOT NULL THEN COALESCE(SCCM_LAST_UN, SCCM_TOP_UN) END, 
     AD_UN) AS BestName