Sql server SQL通过连接相同的表来更新表

Sql server SQL通过连接相同的表来更新表,sql-server,Sql Server,我正在从事一个MS Access DB重写项目,我们正在将其转换为2005 SQL server后端/Winform前端。Access中有一个查询需要转换为在SQL server中运行。以下是访问查询: UPDATE DISTINCTROW VAR, CancelsinTrans INNER JOIN Trans ON (CancelsinTrans.ACCT = Trans.ACCT) AND (CancelsinTrans.ITEM_ID = Trans.ITEM_ID) SET Tra

我正在从事一个MS Access DB重写项目,我们正在将其转换为2005 SQL server后端/Winform前端。Access中有一个查询需要转换为在SQL server中运行。以下是访问查询:

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]));
我正试图找出编写此查询的最佳方法。我打算使用一个存储过程来运行这个更新,但是我应该使用一个表函数来获取记录集

任何帮助都会很好


谢谢

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'
                )

如果可能的话,我实际上正在尝试删除子查询。并将所有代码放在一个存储过程中。@bluefeet-删除子查询与将代码放在单个存储过程中有什么关系?上面是处理Update语句的ANSI方法。CancelsInTrans当前是一个MS Access查询,我们将删除它并用SQL存储过程替换它。此查询仅用于执行此更新一次,因此单独调用它似乎是一种浪费。我并不完全清楚,但听起来您可能希望CancelIsInTrans成为视图而不是存储过程。在这种情况下,使用视图可能会更容易,甚至更有效。@bluefeet-啊。您没有告诉我们CancelsInTran是一个封装Tran表的查询。如果是这种情况,那么您应该能够完全消除连接。
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'
                )
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'