SQL Update表通过加入相同的表

时间:2011-01-19 14:09:47

标签: sql-server

我正在开发一个MS Access DB重写项目,我们正在转换为2005 SQL服务器后端/ Winform前端。我在Access中有一个查询,我需要将其转换为在SQL Server中运行。这是Access查询:

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是一个从Trans表中提取帐户的查询 - 所以基本上它正在加入自身并执行更新。

这是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"));

我正在试图找出编写此查询的最佳方法。我打算使用存储过程来运行此更新,但是我应该使用表函数来获取记录集。

任何帮助都会很棒。

谢谢

1 个答案:

答案 0 :(得分: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]

<强>更新

鉴于CancelsInTran查询封装了Trans表,你可以像这样删除连接:

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'