2010-07-02 47 views
1

我有3個值,我需要從一個表複製到另一個表。這是我的業餘嘗試,我知道這是非常無效的,做這個查詢的正確方法是什麼?幫我做這個SQL更新查詢正確

update [IDAT_PATIENTS] 
    set TargetRabiesSerial = 
    (select top 1 SERIAL_NUMBER 
    from [IDAT_RABIESHISTORY] as rab 
    where TargetPetAccountNum = rab.PATIENT_ACCOUNT_ID 
     and TargetClientAccountNum = rab.CLIENT_ACCOUNT_ID 
    order by rab.DATE_TIME_PERFORMED desc) 
    , TargetRabiesBrandName = 
    (select top 1 BRAND_NAME 
    from [IDAT_RABIESHISTORY] as rab 
    where TargetPetAccountNum = rab.PATIENT_ACCOUNT_ID 
     and TargetClientAccountNum = rab.CLIENT_ACCOUNT_ID 
    order by rab.DATE_TIME_PERFORMED desc) 
    , TargetRabiesTag = 
    (select top 1 TAG_NUMBER 
    from [IDAT_RABIESHISTORY] as rab 
    where TargetPetAccountNum = rab.PATIENT_ACCOUNT_ID 
     and TargetClientAccountNum = rab.CLIENT_ACCOUNT_ID 
    order by rab.DATE_TIME_PERFORMED desc) 
    where TargetClientAccountNum in 
    (select CLIENT_ACCOUNT_ID 
    from [IDAT_RABIESHISTORY] 
    where TargetPetAccountNum = PATIENT_ACCOUNT_ID) 
+0

這是很難沒有模式測試,你至少可以發佈創建表語句,所以我們有東西要測試? – jfrobishow 2010-07-02 20:14:32

回答

3

試試這個:

Update p Set 
    TargetRabiesSerial = h.SERIAL_NUMBER, 
    TargetRabiesBrandName = h.BRAND_NAME, 
    TargetRabiesTag = h.TAG_NUMBER 
    From IDAT_PATIENTS p 
     Join IDAT_RABIESHISTORY h 
      On h.PATIENT_ACCOUNT_ID = p.TargetPetAccountNum 
      And h.CLIENT_ACCOUNT_ID = p.TargetClientAccountNum 
      And h.DATE_TIME_PERFORMED = 
        (Select Max(DATE_TIME_PERFORMED) 
        From IDAT_RABIESHISTORY 
        Where h.CLIENT_ACCOUNT_ID = p.TargetClientAccountNum 
         And h.CLIENT_ACCOUNT_ID = p.TargetClientAccountNum) 
    Where TargetClientAccountNum In 
    (Select CLIENT_ACCOUNT_ID 
    From IDAT_RABIESHISTORY 
    Where TargetPetAccountNum = PATIENT_ACCOUNT_ID) 
+0

當我運行你的代碼時,我得到1行受到影響。我知道我有多個需要更新的記錄。 (我的舊代碼有136107行受到影響) – 2010-07-02 18:56:41

+0

我認爲問題在於你是從最近的記錄中整體拉出來的,我需要每個病人的最新記錄。 – 2010-07-02 19:02:13

+0

因此,對於每個患者,您想要更新所有記錄,而不僅僅是具有最新DATE_TIME_PERFORMED的記錄?但是您想更新患者記錄中具有最新DATE_TIME_PERFORMED的列嗎?但是這對我沒有意義,你正在更新的字段在病人列表中,而不是在歷史記錄表中......我不瞭解你... – 2010-07-02 21:17:23

0

東西或多或少這樣,沒有一個模式來驗證這樣仔細檢查語法:)

update [IDAT_PATIENTS] 
    set TargetRabiesSerial = tblLatestHistory.SERIAL_NUMBER, 
    TargetRabiesBrandName = IDAT_RABIESHISTORY, 
    TargetRabiesTag = IDAT_RABIESHISTORY 
from [IDAT_PATIENTS] 
inner join (
    select PATIENT_ACCOUNT_ID, CLIENT_ACCOUNT_ID, SERIAL_NUMBER, BRAND_NAME, TAG_NUMBER, max(DATE_TIME_PERFORMED) 
    from IDAT_RABIESHISTORY 
    group by PATIENT_ACCOUNT_ID, CLIENT_ACCOUNT_ID, SERIAL_NUMBER, BRAND_NAME, TAG_NUMBER 
) tblLatestHistory 
on TargetPetAccountNum = tblLatestHistory.PATIENT_ACCOUNT_ID 
and TargetClientAccountNum = tblLatestHistory.CLIENT_ACCOUNT_ID