2016-10-17 60 views
0

該公司有一個SQL表[Tatkal_Merge]包含多個分支有很多帳戶。SQL檢查和更新表有條件

無論何時將新賬戶添加到分行,都會掃描並分派每個賬戶的工具包。

每當完成特定分支帳戶的所有掃描時,該分支將被標記爲帶有時間戳的完成。

[br_complete_qc] = 'Y',br_complete_Qc_date = GETDATE()

目前,我們使用下面的代碼都在做相同的:

update Tatkal_Merge set [br_complete_qc]='Y',br_complete_Qc_date=GETDATE() where act_no in (
    select act_no 
    FROM [Tatkal].[dbo].[Tatkal_Merge] 
    where [br_complete_qc]='N' and 
    data_date+br_code not in (select distinct data_date+br_code FROM [Tatkal].[dbo].[Tatkal_Merge] where pin_scan='N') 
) 

數據日期數據類型爲nvarchar。例如:2016-10-16。

帳號Nummber是主鍵。

目前,代碼需要時間來執行。

什麼是更好/正確的方式?

+0

的Microsoft SQL Server 2016 –

+0

究竟爲什麼你存儲'DATE'的VARCHAR? –

+0

該表已由其他人以Date創建爲varchar。不想更改現有的系統。但是這是減緩更新速度的原因嗎? –

回答

0

AVOID子查詢,因爲子查詢它降低執行速度

declare @dateBrcode varchar (100) 
    select distinct @dateBrcode = data_date+br_code FROM 
    [Tatkal].[dbo].  [Tatkal_Merge] where pin_scan='N' 
    declare @actno varchar(100) 
    select @actno = act_no 
    FROM [Tatkal].[dbo].[Tatkal_Merge] 
    where [br_complete_qc]='N' and 
    data_date+br_code not in (@dateBrcode) 

update Tatkal_Merge set [br_complete_qc]='Y', 
br_complete_Qc_date=GETDATE() where act_no in (@actno) 
+0

分行完成後,其中的所有賬戶都會更新。不要認爲它會起作用 –