2010-11-30 59 views
2

我有2个表。对于这个例子,我将只使用一个用户记录。 第一台具有用户名和评估日期为这样:SQL Server 2005 - 如何从一个表中获取记录并通过另一个表寻找匹配的循环

USER EVALDATE 
-------------- 
bobr 6/7/2010 
bobr 9/20/2010 
bobr 9/21/2010 

上述表需要对这个用户履历表,其具有的ID和他们有效日期的历史要加入,以寻找匹配(空日,是指电流):

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中执行此操作?我试图做的只是如果记录日期无效,用标志更新第一个表格。有任何想法吗?谢谢!!!

回答

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 
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 
+0

嗨,我试过这一个,但不能得到它的工作。也许我误解了代码的一些东西? – ramos 2010-11-30 18:52:06

+0

这将返回table1中所有在table1中的开始日期和结束日期之间具有evaldate的用户。如果用户不在表2中,他们将不会出现。这可能是我误解了你的问题。当它不起作用时,你收到了什么信息? – Ramy 2010-11-30 18:57:20

+0

它运行良好,但是当它回来时,我有4条记录:第一条记录的历史记录中有3条记录,第一条表中的每条evaldate有一条记录,然后历史记录表中的最后一条记录与6/7/2010合并从第一张表中记录。 – ramos 2010-11-30 19:12:41

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) 
相关问题