2011-05-17 94 views
2

繼承人情況是,數據庫被創建並且未被標準化。表LUT_ProductInfo包含一個名爲flavor的字段,其中填充了一個實際的味道名稱(即Coke Classic)。我創建了一個查找表LUT_Flavors,其中所有的味道名稱都由PK完成。我需要用LUT_Flavors表中的相應外鍵替換LUT_Product信息中的所有味道名稱。目前,每個表格中的風味名稱是相同的,所以交換應該是乾淨的。sql server:如何用查詢的結果大量替換字段

我想是這樣的:

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 

但是,這打破了一些規則,我想並沒有做任何事情。有沒有人有任何見解?

回答

3

對不起,我在路上,所以沒有數據庫試試這件 - 但嘗試:

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

男人我有過度複雜的事情的習慣。這是一個靶心 – Sinaesthetic 2011-05-17 20:52:43

+0

當。 14秒。 :( – 2011-05-17 20:54:15

+0

我很驚訝「舊式」連接語法仍然有效,但這就是我已經做到的。 – 2011-05-17 21:28:05

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

如果沒有幫助,請貼上錯誤消息。

+0

來自我原來的聲明:消息116,級別16,狀態1,行4 當子查詢未與EXISTS一起引入時,只能在選擇列表中指定一個表達式。 – Sinaesthetic 2011-05-17 20:45:41

+0

看來我懷疑你的查詢的正確部分。使用我建議的路線時,你會得到什麼?還是一樣的錯誤? – 2011-05-17 20:49:43

+0

同樣的錯誤。得到它雖然解決:) – Sinaesthetic 2011-05-17 20:53:23

1
Hi, What about this: 



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

下面是一個例子,我會怎麼做。請注意,我將一個flavourid列添加到LUT_ProductInfo表中。這只是爲了確保傳輸過程順利進行,您可以稍後刪除/重命名它,或者如果您勇敢直接進入專欄。你可能想在更新每條記錄之前備份你的表,但你不想丟失任何東西。

總之,這裏是我的測試代碼:

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 
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),那麼您可能無法獲得所需的結果。您可能必須執行更新,然後更改數據類型。