2012-10-29 28 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