在这种情况下,数据库已创建且未规范化。表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
但这打破了我猜的一些规则,并没有做任何事情。有没有人有任何见解?
答案 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),则可能无法获得所需的结果。您可能必须进行更新,然后更改数据类型。