SQL Server 2005 - Как взять запись из одной таблицы и перебрать другую таблицу в поисках совпадения - PullRequest
2 голосов
/ 30 ноября 2010

У меня есть 2 таблицы. для этого примера я буду использовать только одну запись пользователя. Первая таблица содержит имя пользователя и дату оценки как таковую:

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

Приведенную выше таблицу необходимо объединить с этой таблицей истории пользователей, в которой есть история идентификаторов и даты, когда они были действительными, чтобы найти совпадение (дата 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 находится в одном из этих диапазонов дат, и идентификаторы совпадают, затем пометить эту запись из первой таблицы как действительную.

Текущий код берет запись из первой таблицы и работает со всеми строками второй таблицы и выбирает запись для каждого недействительного evaldate, поэтому он выбирает запись при объединении со второй таблицей, потому что evaldate не находится между даты первой записи в таблице истории, хотя запись в порядке, потому что evaldate находится между начальной и конечной датами третьей записи в таблице истории.

Надеюсь, это имеет смысл! В чем-то вроде SAS я могу создать массив и выполнить цикл проверки каждой записи в таблице истории. Как мне сделать это в SQL? То, что я пытался сделать, это просто обновить первую таблицу с флагом, если даты записей являются недействительными. Есть идеи? Спасибо !!!

Ответы [ 3 ]

1 голос
/ 30 ноября 2010

Попробуйте это:

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 голос
/ 30 ноября 2010

Вы можете попробовать что-то вроде

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)

EDIT

Попробуйте это для всех значений от 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)
0 голосов
/ 30 ноября 2010

попробуйте что-то вроде:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...