2009-10-06 71 views
0

由於MsSql數據庫中添加了一個字段,我必須將表中的記錄從NULL更改爲更有用的內容。僅更新SQL中第一次出現的id

我有一個地址表。由於客戶有多個地址,我們希望將某些地址標記爲默認地址,而其他地址則可以標記爲發貨地址

如何使用查詢將每個地址的第一個地址更改爲「默認」,將其他地址更改爲「發送」?每個地址都通過CustomerId與Customers表有外鍵關係。

只要一個是默認的,其餘的都是默認的,哪一個默認設置並不重要。只需要通過我們的應用程序的UI編輯默認地址,並與其他地址一起顯示錶格。

回答

2

假設地址表使用基於整數的代理主鍵(如IDENTITY列),並且如果您確實不在乎哪個標記爲DEFAULT,則可以執行類似以下操作(更新具有最小整數值的行作爲DEFAULT)。

DECLARE @Addresses TABLE 
    (
     AddressID INT , 
     CustomerID INT , 
     AddressType VARCHAR(8) 
    ) 

INSERT INTO @Addresses 
     (AddressID , 
      CustomerID , 
      AddressType 
     ) 
     SELECT 1 , 
       1 , 
       NULL --Client 1 has 3 addresss 
     UNION ALL 
     SELECT 2 , 
       1 , 
       NULL 
     UNION ALL 
     SELECT 3 , 
       1 , 
       NULL 
     UNION ALL 
     SELECT 4 , 
       2 , 
       NULL --Client 2 has 1 addresses 
     UNION ALL 
     SELECT 5 , 
       3 , 
       NULL --Client 3 has 2 addresses 
     UNION ALL 
     SELECT 6 , 
       3 , 
       NULL 

SELECT * 
FROM @Addresses a 

--update an arbitrary address ASSUMING that you used an integer for a surrogate primary key 
UPDATE @Addresses 
SET  AddressType = CASE WHEN AddressID IN (SELECT MIN(AddressID) 
               FROM  @Addresses a 
               GROUP BY a.CustomerID) THEN 'Default' 
          ELSE 'Shipping' 
         END 


SELECT * 
FROM @Addresses a 
0

取決於什麼是第一個。你是否有這樣的概念,如日期等來訂購它們。記住一個查詢將使用零個或多個索引來獲取數據。這些順序也成爲一個因素。如果您刪除索引,那麼數據的順序將是唯一的因素。

+0

第一個是默認排序的第一個。 – Sorskoot 2009-10-06 09:35:08