2010-11-30 94 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) 
相關問題