2010-06-04 25 views
3

我有一個選擇語句,連接幾個表並獲取一些信息。我想用select中包含的信息來更新其中一個表(在select中找到)中的所有記錄。選擇如下所示:SQL - 如何批量更新給出了一個選擇的結果

SELECT account.id 
     document.id 
FROM customer INNER JOIN account ON 
      (customer.firstname = account.firstname AND 
      customer.lastname = account.lastname AND 
      customer.phone = account.phone) 
     INNER JOIN document ON 
      customer.id = document.customerid 
WHERE document.accountid IS NULL; 

在英文中,文檔可以屬於客戶和帳戶。我正在查找與客戶記錄相匹配的帳戶記錄,而客戶記錄中的記錄與客戶相關,但不是帳戶。現在

,我可以手動辦理結果,並運行此:

UPDATE document 
SET  accountid = /*account.id*/ 
WHERE id = /*document.id*/; 

該工程,我想,但有匹配我的查詢記錄像樣的數目,我想這樣做如果可以的話,在一個單一的聲明。

回答

6
UPDATE document, account, customer 
SET documnet.accountid = account.id 
WHERE (customer.firstname = account.firstname AND customer.lastname = account.lastname AND customer.phone = account.phone) 
AND customer.id = document.customerid 
AND document.accountid IS NULL; 

這應該做這一切在一個去

+0

+1我寫了一個類似的解決方案,你買得更快! :) – 2010-06-04 19:03:12

+0

有趣。我在一個測試數據集(實際的副本)中試了這個,它比原始查詢中的行產生了更多的更新。我將不得不更多地研究它。 – 2010-06-05 21:01:49

+0

可能由於第一次加入。 – 2010-06-05 23:33:29

2

更符合ANSI標準的解決方案將是如下:

Update document 
Set accountid = (
       Select Min(A1.id) 
       From customer As C1 
        Join account As A1 
         On A1.firstname = C1.firstname 
          And A1.lastname = C1.lastname 
          And A1.phone = C1.phone 
       Where C1.id = document.Id 
       ) 
Where accountid Is Null 

我使用Min(A1.id),以確保我得到最多一個account.id爲給定的客戶信息。 UPD規則中的連接沒有得到SQL規範的正式支持,因爲它可能在更新時在同一行可能使用不同的值進行更新時產生歧義。