我最近更新了我的表模式以包含一个新列,该列具有一个或多个可能的值,具体取决于行(我可以从另一个表中提取这些可能的值)。我希望更新我的表并用一个或几个新行替换每个当前单行,其中旧列值全部与原始行匹配,新列值覆盖每个可能值一次。
例如,假设我有一个名为Animal
的表,其中包含AnimalType
,Size
,Habitat
和Weight
列。我添加了一个名为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
表中有多行,并且希望对每个行执行此操作。
有一种简单的方法吗?
谢谢!
答案 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