T-SQL:将数据从一个表移动到另一个表

时间:2010-06-21 05:47:15

标签: c# tsql

在以下情况下,迁移数据的最简单方法是什么:

表A:动物

ANIMAL_ID (PK,IDENTITY)
CAT_NAME
DOG_NAME
BIRD_NAME
FISH_NAME

表B:ANIMAL_NEW

ANIMAL_ID (PK,IDENTITY)
ANIMAL_TYPE(INT)
ANIMAL_NAME

我已经改变了设计,所以我没有使用4个相同的表列,而是引入了一个ANIMAL_TYPE列,它将是一个枚举{Cat = 0,Dog = 1,Bird = 2,Fish = 3} ...

迁移数据的最快方法是,考虑到如果CAT_NAMEDOG_NAME为空,则不应在新表中创建记录。

由于

2 个答案:

答案 0 :(得分:1)

你可以做4个单独的陈述:

INSERT INTO animal_new (animal_id, animal_type, animal_name)
SELECT
  animal_id, 0, cat_name
FROM
  animal
WHERE
  cat_name IS NOT NULL

INSERT INTO animal_new (animal_id, animal_type, animal_name)
SELECT
  animal_id, 1, dog_name
FROM
  animal
WHERE
  dog_name IS NOT NULL

(etc)

这假设cat_name,dog_name,bird_name,fish_name中只有一个在原始设计中不是NULL。如果情况并非如此,那么您将无法使用新的animal_id主键...

答案 1 :(得分:1)

您可以使用简单的CASE

INSERT INTO animal_new(animal_id, animal_type, animal_name)
SELECT animal_id, 
  animal_type =
  CASE 
    WHEN LEN(cat_name) > 0 THEN 1
    WHEN LEN(dog_name) > 0 THEN 2
    WHEN LEN(bird_name) > 0 THEN 3
    WHEN LEN(fish_name) > 0 THEN 4
    ELSE 5 
  END,
  animal_name =
  CASE 
    WHEN LEN(cat_name) > 0 THEN cat_name
    WHEN LEN(dog_name) > 0 THEN dog_name
    WHEN LEN(bird_name) > 0 THEN bird_name
    WHEN LEN(fish_name) > 0 THEN fish_name
    ELSE ''
  END
FROM animal;

两种情况下的ELSE都是没有设置任何动物名称。