2012-10-29 30 views
0

我最近更新了我的表模式以包含一個新列,它具有一個或多個取決於行的可能值(我可以從另一個表中抽取這些可能的值)。我希望更新我的表格,並用一個或多個新行替換每個當前單行,其中舊列值都與原始行匹配,並且新列值覆蓋每個可能的值一次。SQL多重插入,基於現有行的行數據

舉個例子,假設我有一個表叫Animal,與列AnimalTypeSizeHabitatWeight。我添加了一個名爲Color的新欄 - 有些動物只有一種顏色,有些可以有幾種可能的顏色之一。假設我有Bird一排,看起來像這樣:

{ AnimalType = Bird, Size = Small, Habitat = Woods, Weight = under 10 pounds, Color = NULL } 

現在假設,根據我的其他表(稱之爲AnimalColors),Birds可以有三種顏色 - 紅色,藍色和棕色。

我希望與看起來像以下三個新行來替代單行:

{AnimalType = Bird, Size = Small, Habitat = Woods, Weight = under 10 pounds, Color = Red} 
{AnimalType = Bird, Size = Small, Habitat = Woods, Weight = under 10 pounds, Color = Blue} 
{AnimalType = Bird, Size = Small, Habitat = Woods, Weight = under 10 pounds, Color = Brown} 

我有我Animals表多行,並希望他們每個人的執行此操作。

有沒有簡單的方法來做到這一點?

謝謝!

回答

3

我想看看解決這個問題,通過保留現有的行。

創建基於色彩的填充現有行新行

刪除空行

-- Add rows with color populated 
WITH AnimalColors (AnimalType, Color) AS 
(
    SELECT 'bird', 'red' 
    UNION ALL SELECT 'bird', 'blue' 
    UNION ALL SELECT 'bird', 'brown' 
    UNION ALL SELECT 'lizard', 'green' 
) 
, ExistingRows(AnimalType, Size, Habitat, Weight, Color) AS 
(
    SELECT 'bird', 'small', 'woods', 'under 10 pounds', NULL 
    UNION ALL SELECT 'lizard', 'small', 'rocks', 'under 10 pounds', NULL 
) 
INSERT INTO 
    Animal 
(
    AnimalType 
, Size 
, Habitat 
, Weight 
, Color 
) 
SELECT 
    ER.AnimalType 
, ER.Size 
, ER.Habitat 
, ER.Weight 
, AC.Color 
FROM 
    AnimalColors AC 
    INNER JOIN 
     ExistingRows ER 
     ON ER.AnimalType = AC.AnimalType; 

-- Manually review values of Animal table 
SELECT A.* FROM Animal A ORDER BY A.AnimalType, A.Color; 

-- Remove the uncolored rows 
DELETE A FROM Animal A WHERE A.Color IS NULL; 
+0

是的,我更喜歡這樣做 - 我對SQL還比較陌生,我想確保我不會丟失任何現有的數據。 編輯:張貼此之前,您的查詢添加到您的文章。謝謝! – thomas

+0

有沒有辦法避免爲每隻動物手動輸入可能的顏色?如「對於動物表中的每個動物,選擇其所有可能的顏色,然後執行這些插入。」我有大約200行,我需要做這個操作。 – thomas

+0

'WITH AnimalColors'部分只是一個展示概念的地方。我假設你已經創建並填充了數據表。這是不正確的?如果你正在尋找最小的改變,只需用'SELECT AnimalType,Color FROM AnimalColors'替換'SELECT'bird','red''部分的內容' – billinkc

1

d:

您需要添加另一個表中任何可能有不止一個值,否則你問在將來的麻煩,當涉及到更新和刪除這些屬性(見正常化)。

例如,添加一個「AnimalColor」表,該表使用AnimalID鏈接回Animal表。你的數據庫可能看起來像這樣:

Animals 
AnimalID AnimalName 

AnimalColors 
AnimalID Color 
+0

喜(驗證它看起來如預期後) - 我有第二個表了,但我需要現在將每個AnimalID的每種顏色表示爲單獨的實體。複製所有現有的列是第一步,但可能這些字段將來可能會單獨修改。 – thomas