将一个表复制到具有不同列的另一个表

时间:2020-07-21 18:03:03

标签: sql sql-server

我有一个TableA列是(id,name,A,B,C,p_id)

我想将TableA转换为TableB,TableB列为(id,name,alphabets,alphabets_value,p_id)

记录在表A中

package main

import (
    "log"
    "os/exec"
    "path/filepath"
)

func main() {
    fname, err := exec.LookPath("go")
    if err == nil {
        fname, err = filepath.Abs(fname)
    }
    if err != nil {
        log.Fatal(err)
    }

    log.Println(fname)
}

在表B中预期

id | name | A | B | C | p_id
1  | xyz  | a | b |   | 1
2  | opq  | a`| b`| c`| 1

我想要当前使用Microsoft SQL的TableB输出

1 个答案:

答案 0 :(得分:2)

这是一个关键点,可能最容易由UNION ALL解释:

SELECT id, name, 'A' as alphabets, a as alphabets_value, p_id
UNION ALL
SELECT id, name, 'B' as alphabets, b as alphabets_value, p_id
UNION ALL
SELECT id, name, 'C' as alphabets, c as alphabets_value, p_id

然后您可以在此处从中删除空值,并在ROW_NUMBER处给自己一个伪造的U_id:

SELECT ROW_NUMBER() OVER(ORDER BY id, alphabets) as u_id, x.*
FROM
(
  SELECT id, name, 'A' as alphabets, a as alphabets_value, p_id
  UNION ALL
  SELECT id, name, 'B' as alphabets, b as alphabets_value, p_id
  UNION ALL
  SELECT id, name, 'C' as alphabets, c as alphabets_value, p_id
)
WHERE
  x.alphabets_value IS NOT NULL

一旦获得所需的结果集,将其插入表B的INSERT INTO,UPDATE FROM或MERGE就是不重要的