sql server:如何用查询结果批量替换字段

时间:2011-05-17 20:36:06

标签: sql-server replace

在这种情况下,数据库已创建且未规范化。表LUT_ProductInfo包含一个名为flavor的字段,该字段填充了实际的flavor名称(即Coke Classic)。我创建了一个查找表LUT_Flavors,其中所有的风味名称都包含PK。我需要用LUT_Flavors表中相应的外键替换LUT_Product信息中的所有flavor名称。目前,每个表中的风味名称都是相同的,因此交换应该是干净的。

我试过这样的事情:

update LUT_ProductInfo 
set flavor =
     (select LUT_Flavor.id, LUT_Flavor.flavor 
      from LUT_ProductInfo prod 
      join LUT_Flavor on LUT_Flavor.flavor = prod.flavor).ID
where 
      LUT_ProductInfo.flavor = (select LUT_Flavor.id,LUT_Flavor.flavor 
                                from LUT_ProductInfo prod 
                                join LUT_Flavor
                                on LUT_Flavor.flavor = prod.flavor).flavor

但这打破了我猜的一些规则,并没有做任何事情。有没有人有任何见解?

5 个答案:

答案 0 :(得分:3)

对不起,我在路上,所以没有数据库可以尝试这个 - 但请尝试:

update LUT_ProductInfo 
set flavor = f.id
from  LUT_ProductInfo p, 
LUT_Flavour f
where f.flavor = p.flavor

答案 1 :(得分:1)

Hi, What about this:



  UPDATE LUT_ProductInfo product
  SET flavor = 
  (
      select LUT_Flavor.id
      from LUT_Flavor prod 
      where prod .flavor  = product.flavor
  )

答案 2 :(得分:1)

以下是我将如何做的一个例子。请注意,我在LUT_ProductInfo表中添加了flavourid列。这只是为了确保转移顺利进行,你可以稍后删除/重命名,或者如果你勇敢的话直接进入专栏。您可能希望在更新每条记录之前备份您的表,但您不希望丢失任何内容。

无论如何,这是我的测试代码:

CREATE TABLE #LUT_ProductInfo (
    ProdID int PRIMARY KEY,
    flavor varchar(10),
    flavorid int NULL)

INSERT INTO #LUT_ProductInfo VALUES (1,'Vanilla', NULL)
INSERT INTO #LUT_ProductInfo VALUES (2,'Chocolate', NULL)
INSERT INTO #LUT_ProductInfo VALUES (3,'Strawberry', NULL)

CREATE TABLE #LUT_Flavor (
    flavorid int PRIMARY KEY,
    flavor varchar(10))

INSERT INTO #LUT_Flavor VALUES (1,'Chocolate')
INSERT INTO #LUT_Flavor VALUES (2,'Vanilla')
INSERT INTO #LUT_Flavor VALUES (3,'Strawberry')

SELECT * FROM #LUT_ProductInfo

/* What you want is here */
UPDATE prodinfo
SET flavorid = fl.flavorid
FROM #LUT_ProductInfo AS prodinfo
INNER JOIN #LUT_Flavor AS fl
ON prodinfo.flavor = fl.flavor
/* End what you want */

SELECT * FROM #LUT_ProductInfo

DROP TABLE #LUT_ProductInfo
DROP TABLE #LUT_Flavor

答案 3 :(得分:0)

没有错误信息很难判断。

也许尝试:(select LUT_Flavor.id from LUT_ProductInfo prod join LUT_Flavor on LUT_Flavor.flavor = prod.flavor)

而不是

(select LUT_Flavor.id,LUT_Flavor.flavor from LUT_ProductInfo prod join LUT_Flavor on LUT_Flavor.flavor = prod.flavor).ID

如果没有帮助,请粘贴错误消息。

答案 4 :(得分:0)

更好的方法是:

update LUT_ProductInfo
set flavor = fl.id
from LUT_ProductInfo pi
inner join LUT_Flavor fl on fl.flavor = pi.flavor

有一个from子句并以这种方式加入。此解决方案也假设flavor和ID之间的数据类型是兼容的,如果id是int并且flavor是nvarchar(x),则可能无法获得所需的结果。您可能必须进行更新,然后更改数据类型。