SQL多次插入,基于现有行的行数据

时间:2012-10-29 15:51:29

标签: sql insert row

我最近更新了我的表模式以包含一个新列,该列具有一个或多个可能的值,具体取决于行(我可以从另一个表中提取这些可能的值)。我希望更新我的表并用一个或几个新行替换每个当前单行,其中旧列值全部与原始行匹配,新列值覆盖每个可能值一次。

例如,假设我有一个名为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表中有多行,并且希望对每个行执行此操作。

有一种简单的方法吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

我会考虑通过保留现有行来解决这个问题。

使用基于现有行填充的颜色创建新行

删除NULL行(在验证它看起来像预期之后)

-- 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;

答案 1 :(得分:1)

d

您需要为可能包含多个值的任何属性添加另一个表,否则在将来更新和删除时会遇到麻烦(请参阅规范化)。

例如,添加一个“AnimalColor”表,该表使用AnimalID链接回Animal表。您的数据库可能如下所示:

Animals
AnimalID  AnimalName

AnimalColors
AnimalID  Color