Sql server 2005 SQL Server 2005-如何从一个表中获取记录并在另一个表中循环查找匹配项
我有两张桌子。对于这个例子,我将只使用一个用户记录。 第一个表的用户名和评估日期如下:Sql server 2005 SQL Server 2005-如何从一个表中获取记录并在另一个表中循环查找匹配项,sql-server-2005,tsql,Sql Server 2005,Tsql,我有两张桌子。对于这个例子,我将只使用一个用户记录。 第一个表的用户名和评估日期如下: USER EVALDATE -------------- bobr 6/7/2010 bobr 9/20/2010 bobr 9/21/2010 需要将上表与此用户历史记录表(其中包含ID的历史记录及其有效日期)关联,以查找匹配项(空日期表示当前): 我在SQLServer2005中尝试做的是从第一个表中获取第一条记录,在第二个表中循环它,如果EVALDATE在这些日期范围内且ID匹配,则将第一个表
USER EVALDATE
--------------
bobr 6/7/2010
bobr 9/20/2010
bobr 9/21/2010
需要将上表与此用户历史记录表(其中包含ID的历史记录及其有效日期)关联,以查找匹配项(空日期表示当前):
我在SQLServer2005中尝试做的是从第一个表中获取第一条记录,在第二个表中循环它,如果EVALDATE在这些日期范围内且ID匹配,则将第一个表中的记录标记为有效
当前代码从第一个表中获取记录,并针对第二个表的所有行运行,并针对每个无效的evaldate踢出一条记录,因此在与第二个表合并时踢出一条记录,因为evaldate不在历史表上第一条记录的日期之间,即使记录没有问题,因为evaldate在历史记录表中第三条记录的开始日期和结束日期之间
我希望这是有意义的!在SAS之类的系统中,我可以创建一个数组,并通过检查历史记录表中的每条记录来循环。如何在SQL中实现这一点?我试图做的只是在记录日期无效时用一个标志更新第一个表。有什么想法吗?谢谢 试试以下方法:
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
试试这个:
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
你可以试试类似的东西
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)
但这会隐藏无效的评估,因为
用户
不存在于一个或另一个表中。是的,我需要原始表显示所有记录,并将其标记为有效或无效。这是可行的,但它确实删除了无效的记录。尽管如此,代码仍然有效!谢谢阿斯坦德!!将内部联接更改为左联接,然后使用CASE检查是否存在。我会像X-)一样快速地把它添加到答案中。嗨,我先尝试了这个,但没能让它工作。也许我误解了代码的某些内容?这将返回表2中的所有用户,这些用户也在表1中,其evaldate位于表2的开始日期和结束日期之间。如果用户不在表2中,则不会显示。可能是我误解了你的问题。当它不起作用时,你得到了什么信息?它运行了,但当它返回时,我有4条记录:第一条记录的历史表中有3条记录,第一条表中的每个evaldate都有一条记录,然后历史表中的最后一条记录与第一条表中的2010年6月7日记录合并。这很有效!我在where子句中添加了AND语句来检查用户ID是否匹配,它似乎正在做我需要它做的事情。看起来很简单,但我想不出来!谢谢布拉德,我真的很感激。
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)