我有几张表完全外联在一起。在这个问题中,我们简化为只有 2 个表格。FULL JOINS 的原因是生产表有许多不一致的字段,例如 dates1 可能包含 Revenue 和 Compensation,而 dates2 可能包含 NumHeadBangers 和 NumNormalBods;所以在以下之间做 UNION ALL 是行不通的:
create table dates1
(
USERID INT,
[Date] datetime
)
insert into dates1
values
( 1, '01 jan 2012'),
( 2, '03 jan 2012')
create table dates2
(
USERID INT,
[Date] datetime
)
insert into dates2
values
( 2, '01 jan 2012'),
( 4, '04 jan 2012')
对于每个 USERID,我们需要找到最短日期。这是尝试,我使用了 COALESCE,因为在生产脚本中可能有 4 或 5 个表加入:
SELECT
COALESCE(x.USERID,y.USERID) USERID
, CASE WHEN x.[Date] < Y.[DATE]
THEN x.[Date]
ELSE Y.[DATE] END [DATE]
FROM
dates1 x
FULL OUTER JOIN dates2 y
ON x.USERID = y.USERID
以上返回以下内容,这对于用户 1 来说是错误的,因为我们要求用户 1 的最小日期为 2012 年 1 月 1 日。此外,一旦我们处理 4 个表,上述 CASE 语句就会变得非常混乱。
查找这些日期的可扩展脚本是什么?
我一直在使用的一个混乱的解决方案是:
SELECT
COALESCE(x.USERID,y.USERID) USERID
, CASE
WHEN ISNULL(x.[Date],'1 JAN 2020') < ISNULL(Y.[DATE],'1 JAN 2020')
THEN ISNULL(x.[Date],'1 JAN 2020')
ELSE ISNULL(Y.[DATE],'1 JAN 2020')
END [DATE]
FROM
dates1 x
FULL OUTER JOIN dates2 y
ON x.USERID = y.USERID