2012-08-27 49 views
4

项目(4列,简化为清楚起见)TSQL - 更新表从本身

Record | Item | Price | Zone

数据

1  | 100 | 10.00 | A 
2  | 100 | NULL | B 
3  | 100 | NULL | C 
4  | 200 | 25.00 | A 
5  | 200 | NULL | B

尝试与相应的更新NULL小号基于Item的非NULL的值。因此,所有项目100将读取10.00,两个项目200将读取25.00。

我觉得这应该是超级简单,但无法弄清楚自我参考。

感谢

+0

[?你尝试过什么(http://www.whathaveyoutried.com) – Kermit

+0

哇,这是一个咆哮! –

+0

njk - 点采取和理解。我没有任何我认为很接近的东西,所以我把它保留了下来。我会在将来更详细地介绍它。感谢您的回应。 – FreeMars

回答

13

这里ü去

UPDATE a 
SET a.Price=b.Price 
FROM Item AS a 
INNER JOIN Item AS b 
ON a.item=b.item 
WHERE a.Price is NULL AND b.price is NOT NULL 

,或者如果有多个非空的价格,要选择最高价格。

UPDATE a 
SET a.Price=(SELECT MAX(b.PRICE) FROM ITEM AS b WHERE b.Item=a.Item and b.Price is not null) 
FROM Item AS a 
WHERE a.Price is NULL 
0

如果您有一个项目的多个价格,需要选择一个。该样本选取最小的一个(这是一个有点与列名item是相同的表名混淆):

UPDATE item i 
    SET price = (SELECT MIN(price) 
       FROM item 
       WHERE item = i.item 
       GROUP BY item) 
+0

就我的例子中的混淆命名约定达成一致。这些是我用来代替实际名称的快速名称,field235,field9494等。感谢您的回应。 – FreeMars