Sql server SQL通过连接相同的表来更新表
我正在从事一个MS Access DB重写项目,我们正在将其转换为2005 SQL server后端/Winform前端。Access中有一个查询需要转换为在SQL server中运行。以下是访问查询: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
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'