1

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

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

有没有一种简单的方法可以做到这一点?

谢谢!

4

2 回答 2

4

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

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

删除 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;
于 2012-10-29T15:56:30.410 回答
1

丁:

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

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

Animals
AnimalID  AnimalName

AnimalColors
AnimalID  Color
于 2012-10-29T15:55:03.387 回答