2009-09-22 56 views
2

我們有一個數據庫,其中包含有關項目預訂時間的信息。我們有一個項目的實時記錄,它包含正確的時間信息(每週從SAP導入一次)。對於每個SQL查詢

我們也有存檔記錄顯示在某個時間點的時間信息,這些記錄每週進行一次,基本上是快照。 用戶以後可能會提出調整項目時間的請求。如果發生這種情況,實時記錄將反映項目的正確時間,但快照不會。 我需要編寫一個查詢,並在此時使用正確的項目時間更新這些快照。

我們有一個SAP數據表,它包含項目的每個時間條目的記錄,顯示項目代碼的用途,日期和時間。歷史數據表包含項目的代碼和拍攝快照的日期。 因此,我需要編寫一個將通過歷史數據表的SQL查詢,並且對於每一行,通過查看SAP表並在獲取快照日期之前獲取所有時間代碼,獲取該項目代碼所花費的時間。

我真的很難做到這一點在一個SQL查詢,主要問題是我真的需要運行歷史數據表中的每個記錄查詢。我不斷地提出建議使用遊標的頁面,但我對它們不甚瞭解,並不斷看到文章說它們不好。任何關於我可以使用哪種查詢的建議都會很棒!

基本上我想要的僞做的是:

For Each Project Code in the hostorical data table, archived on a date, select all time entrys on or before that date. 

示例表

Historical Project Data       SAP Data 
-----------------------      ---------------- 
Project Code | run date      Project Code | Time | Date 
1234   | 01/09/2009      1234   | 2 | 29/08/2009 
9876   | 01/09/2009      1234   | 5 | 29/08/2009 
1234   | 07/09/2009      9876   | 10 | 02/09/2009 
9876   | 07/09/2009      1234   | 2 | 03/09/2009 

所以我想用一個查詢,顯示

Project Code | run date | time 
1234   | 01/09/2009 | 7      
9876   | 01/09/2009 | 0      
1234   | 07/09/2009 | 9      
9876   | 07/09/2009 | 10 
落得

因此,例如,查詢中的第一條記錄顯示所有小時b在2009年9月1日或之前開始項目1234。

+0

忽略別人說遊標是壞的。他們只是不明白。如果他們試圖用鑽頭將釘子釘入牆上,那不是鑽頭的缺點。 – 2009-09-22 09:19:27

+0

雖然我不會說'絕對不需要使用遊標',但要養成基於集合的邏輯和思維的習慣是非常重要的。當一個非常簡單的基於集合的查詢能夠以簡單,簡單和快速的方式解決問題時,總是直接進入循環,遊標和程序思維是很多錯誤。 – 2009-09-22 12:03:26

+0

這恰恰與Access有關? – 2009-09-23 01:51:59

回答

1

這似乎工作基於數據您提供:

create table #historical_project 
(project_code int 
,run_date datetime 
) 

create table #sap 
(project_code int 
,time_val int 
,date datetime 
) 

insert #historical_project 
     select 1234,'20090901' 
union select 9876,'20090901' 
union select 1234,'20090907' 
union select 9876,'20090907' 

insert #sap 
     select 1234,2 , '20090829' 
union select 1234,5 , '20090829' 
union select 9876,10, '20090902' 
union select 1234,2 , '20090903' 


SELECT * 
     ,(SELECT ISNULL(SUM(time_val),0) 
      FROM #sap    AS sp 
      WHERE hp.project_code = sp.project_code 
      AND hp.run_date  >= sp.DATE 
     ) AS time 
FROM #historical_project AS hp 
ORDER BY run_date 
     ,project_code 
+0

這很好,謝謝 – 2009-09-22 13:57:41

0

這只是一個SELECT語句(使用非等連接)。我建議在嘗試進行數據庫開發之前學習基本的SQL概念。

+0

那麼這不完全正確,因爲連接需要在項目代碼上,我需要爲歷史數據表中的每個項目代碼獲取此數據,這使其複雜化 – 2009-09-22 09:46:23

+0

沒有什麼阻止您使用連接條件,如... FROM a JOIN b ON b.date erikkallen 2009-09-22 16:38:53