我在我们的环境中给出特定机器名称的“用户名”字段查询3个不同的数据库(总共4个字段):SCCM,McAfee EPO和ActiveDirectory。
四列是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 :(得分:1)
你可以从COALESCE函数中获益,获得第一个NON-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
答案 1 :(得分: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