我有2张桌子。对于此示例,我将只使用一个用户记录。 第一个表具有用户名和评估日期:
USER EVALDATE
--------------
bobr 6/7/2010
bobr 9/20/2010
bobr 9/21/2010
上表需要连接到此用户历史记录表,该表具有ID的历史记录和有效的日期,以查找匹配项(NULL日期表示当前):
USER STARTDATE ENDDATE
----------------------------
bobr 2/20/2006 4/18/2010
bobr2 4/19/2010 9/7/2010
bobr 9/8/2010 null
我在SQL Server 2005中尝试做的是从第一个表中获取第一个记录,将其循环到第二个表中,当(如果)EVALDATE在这些日期范围之一且ID匹配时,则标记从第一个表中记录为有效。
当前代码从第一个表中获取记录并针对第二个表的所有行运行并为每个无效的evaldate输出一条记录,因此当它连接到第二个表时它会踢出一条记录,因为evaldate不在历史记录表中第一条记录的日期,即使记录正常,因为evaldate位于历史记录表中第三条记录的开始日期和结束日期之间。
我希望这是有道理的!在类似SAS的东西中,我可以创建一个数组并通过检查历史表中的每个记录来循环。我如何在SQL中执行此操作?我想要做的只是在记录日期无效的情况下用标志更新第一个表。有任何想法吗?感谢!!!
答案 0 :(得分:1)
试试这个:
SELECT [USER]
,[EVALDATE]
,CASE WHEN ( SELECT COUNT(*)
FROM [UserStartEndDates] b
WHERE [a].[USER] = [b].[User]
AND [EVALDATE] BETWEEN [STARTDATE]
AND COALESE([ENDDATE],[EVALDATE])
) > 0 THEN 1
ELSE 0
END AS [IsValid]
FROM [Evaluations] a
答案 1 :(得分:1)
您可以尝试类似
的内容Select *
FROM Users u INNER JOIN
UserHistory uh ON u.User = uh.User
AND u.EvalDate BETWEEN uh.StartDate
AND ISNULL(uh.EndDate, u.EvalDate)
修改强>
对User
Select u.*,
CASE
WHEN uh.User IS NULL
THEN 'Invalid'
ELSE 'Valid'
END Validity
FROM Users u LEFT JOIN
UserHistory uh ON u.User = uh.User
AND u.EvalDate BETWEEN uh.StartDate
AND ISNULL(uh.EndDate, u.EvalDate)
答案 2 :(得分:0)
尝试类似:
select * from [table2] t2
join [table1] t1 on t1.user = t2.user
--or better yet the foreign key
where t1.user = t2.user and t1.evaldate
between t2.startdate and t2.enddate