2013-10-23 30 views
1

我很少在與SQL打交道時使用update語句,並且在執行此操作時有點緊張。在我之前提出的一個問題中,我決定需要在某些表中添加標識列以用作代理鍵。鑑於170萬行,我希望儘可能順利地做到這一點。所以我需要做的就是運行一個更新循環並用相關數據更新每個字段。更新查詢以通過循環運行以更新許多行

表1:tblPostCodeLookup

Postcode | Postcode ID 
AB44  | 1 
AB45  | 2 

表2:tblPostcodeStreetView

ID | Postcode | Postcode ID 
1 | AB446TR | 1 
2 | AB447TY | 1 
3 | AB457HH | 2 

我就得到了爲做基本的更新

UPDATE tblPostcodesStreetsView 
SET    PostcodeID = 1 
WHERE  (postcode LIKE 'AB44%') 

但是得到這個貫穿並更新每一個正在導致我問題的!

+0

我非常需要它通過每個郵政編碼方差的樣子。所以如果它的AB44將它更新爲一個,如果ab45 a 2,ab46 a 3,那麼通過ID的 – GPH

+0

@Gavlaaa列表,那麼直到哪個數字你有PostCode?哪個是第一個PostCode AB44? –

+0

@mr_eclair表中有一個需要進入表2的郵編匹配的ID。因此,表2中的郵編匹配1後,它會更新它。 – GPH

回答

6
UPDATE psv 
SET    PostcodeID = pcl.PostcodeID 
FROM tblPostcodesStreetsView psv 
     INNER JOIN 
     tblPostCodeLookup pcl 
      on 
      pcv.postcode LIKE pcl.postcode + '%' 

應該這樣做。除非在tblPostCodeLookup中有多個行與tblPostcodesStreetsView中的同一行匹配 - 在這種情況下,哪個PostCodeID分配的定義不明確。

UPDATE...FROM是SQL Server方言,它不是標準的SQL。一個標準的方法會是這樣的:

UPDATE tblPostcodesStreetsView 
SET  PostcodeID = (select pcl.PostcodeID from tblPostCodeLookup pcl 
       where tblPostcodesStreetsView.postcode LIKE pcl.postcode + '%') 

這將至少會產生上述我提到的多個匹配場景的錯誤。

+0

+1「除非有多行......在這種情況下,分配的PostCodeID沒有很好的定義。」 – gvee

+0

@Damien_The_Unbeliever - 現貨並幸運的是沒有多行!非常感謝 – GPH

1

完整性檢查的結果將是什麼樣子:

SELECT tblPostcodeStreetView.Postcode 
    , tblPostCodeLookup.Postcode 
    , tblPostCodeLookup.Postcode_ID 
FROM tblPostcodeStreetView 
INNER 
    JOIN tblPostCodeLookup 
    ON tblPostcodeStreetView.Postcode LIKE tblPostCodeLookup.Postcode + '%' 

將此更新語句

UPDATE tblPostcodeStreetView 
SET Postcode_ID = tblPostCodeLookup.Postcode_ID 
FROM tblPostcodeStreetView 
INNER 
    JOIN tblPostCodeLookup 
    ON tblPostcodeStreetView.Postcode LIKE tblPostCodeLookup.Postcode + '%'