0

我正在查询 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,

但是必须有一种更好的方法将这些记录合并为一个。我的下一步是权衡“平均年龄”,然后从那里选择用户名,丢弃“管理员”。

有什么想法或技巧吗?

4

2 回答 2

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
于 2013-02-15T00:17:32.247 回答
0

如果您只想获取不为空的最新用户名,请尝试使用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

于 2013-02-15T00:12:25.420 回答