Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 SQL Server 2005-如何从一个表中获取记录并在另一个表中循环查找匹配项_Sql Server 2005_Tsql - Fatal编程技术网

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)