2011-01-19 58 views
1

我正在處理一個MS Access數據庫重寫項目,我們正在轉換到2005 SQL服務器後端/ Winform前端。我在Access中有一個查詢,我需要將其轉換爲在SQL Server中運行。下面是Access查詢:SQL更新表加入相同表

UPDATE DISTINCTROW VAR, CancelsinTrans 
INNER JOIN Trans ON (CancelsinTrans.ACCT = Trans.ACCT) AND (CancelsinTrans.ITEM_ID = Trans.ITEM_ID) 
SET Trans.TRAN_CD = "1", Trans.LastUpdated = Date() 
WHERE (((Trans.TRAN_CD)<>"1" Or (Trans.TRAN_CD) Is Null) AND 
((CancelsinTrans.TRAN_DT)<[VAR]![Import1]) AND 
((Trans.TRAN_DT)<[VAR]![Import1])); 

的CancelsinTrans是從跨臺拉賬戶查詢 - 所以基本上是加入對自身進行更新。

這裏是CancelsInTrans查詢:

SELECT Trans.ACCT, Trans.TRAN_TYPE_CD, Trans.TRAN_SUBOR_CD, Trans.M_SRCE_CD, Trans.TRAN_RQST_CD, Trans.TRAN_AM, Trans.TRAN_DR_CR_CD, Trans.TRAN_CXL_CD, Trans.ACCTG_CD, Trans.ITEM_ID, Trans.TRAN_DT, Trans.TRAN_EXEC_TM, Trans.TRAN_QY, Trans.TRAN_NET, Trans.TRAN_EXEC_PR, Trans.M_SECURITY_NR, Trans.M_ORF_OR_ORDRNO, Trans.M_SEQ_NBR, Trans.TRAN_SETTL, Trans.M_ORDER_TAKER_ID, Trans.QUOTR_SEC, Trans.PROD_CD, Trans.SEC_CD, Trans.TRAN_EXEC_DT 
FROM Trans 
WHERE (((Trans.TRAN_TYPE_CD)="TR") AND ((Trans.TRAN_SUBOR_CD)="TR") AND ((Trans.TRAN_CD)="1") AND ((Trans.ACCTG_CD)="1")); 

我試圖找出寫此查詢的最佳方式。我打算使用存儲過程來運行此更新,但是我應該使用表函數來獲取記錄集。

任何幫助將是偉大的。

感謝

回答

2

在SQL Server相當於將類似以下內容:

Update Trans 
Set TRAN_CD = '1' 
    , LastUpdated = GETDATE() 
Where (Trans.TRAN_CD <> '1' Or Trans.TRAN_CD Is Null) 
    And Trans.TRAN_DT < 'some var value' 
    And Exists (
       Select 1 
       From CancelsinTrans As C1 
       Where C1.ACCT= Trans.ACCT 
        And C1.ITEM_ID = Trans.ITEM_ID 
        And C1.TRAN_DT < 'some var value' 
       ) 

在這種情況下,請通過參數化查詢,你會替換爲值some var value[VAR]![Import1]我推測是形式價值。

UPDATE

鑑於CancelsInTran查詢封裝橫貫表,就可以消除加入像這樣:

Update Trans 
Set TRAN_CD = '1' 
    , LastUpdated = GetDate() 
Where TRAN_TYPE_CD = 'TR' 
    And TRAN_SUBOR_CD = 'TR' 
    And ACCTG_CD = '1' 
    And (TRAN_CD <> '1' Or TRAN_CD Is Null) 
    And TRAN_DT < 'some value' 
+0

其實我想如果可能的話,除去子查詢。並將所有代碼存儲到一個存儲過程中。 – Taryn 2011-01-19 19:28:31