SQL Server 2005 - 如何从一个表中获取记录并循环遍历另一个表以查找匹配项

时间:2010-11-30 18:17:09

标签: sql-server-2005 tsql

我有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中执行此操作?我想要做的只是在记录日期无效的情况下用标志更新第一个表。有任何想法吗?感谢!!!

3 个答案:

答案 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