在一列中将数据从一个表插入另一个表,同时在另一列中插入新数据

时间:2016-04-01 17:12:20

标签: sql-server database-design

我目前正在学习T-SQL,我制作了这个用于学习sql和数据库设计的表。目前,我在一个表中的数据看起来像这样:

ProductID     AmountOfTypeA    AmountOfTypeB    AmountOfTypeC    some other atributes 
                                                                describing product....
---------     -------------    -------------    -------------
101           1                2                0
102           0                1                3
103           5                0                0

etc...

我希望规范化这些数据并消除冗余0,其中没有该类型的产品。我用一个列创建了一个新表:' ProductID',' Type'和'金额'并使用Foreign键通过ProductID链接两个表。目前,我正在使用INSERT INTO dbo.tProdTypes (ProductID, Amount) FROM dbo.tProducts逐列,然后我手动填充'类型'柱。

但是我想知道是否可以在一个查询中执行此操作,特别是将其他表中的一些数据作为一列插入,将一些自定义数据作为第二列插入。此外,我不介意逐列,但如果有办法立即插入所有列,那就太棒了。

2 个答案:

答案 0 :(得分:2)

我认为这样的事情会起作用:

INSERT tProdTypes (ProductID, Amount, Type)
SELECT ProductID, AmountOfTypeA, 'TypeA'
FROM tProducts
WHERE AmountOfTypeA > 0
UNION
SELECT ProductID, AmountOfTypeB, 'TypeB'
FROM tProducts
WHERE AmountOfTypeB > 0
UNION
SELECT ProductID, AmountOfTypeC, 'TypeC'
FROM tProducts
WHERE AmountOfTypeC > 0

答案 1 :(得分:1)

你也可以使用UNPIVOT:

;WITH cte AS (
SELECT *
FROM (VALUES
(101, 1, 2, 0),
(102, 0, 1, 3),
(103, 5, 0, 0)
) as t (ProductID, AmountOfTypeA, AmountOfTypeB, AmountOfTypeC)
)

SELECT ProductID, Amount, [Type] 
FROM 
   (SELECT ProductID, AmountOfTypeA AS A, AmountOfTypeB AS B, AmountOfTypeC AS C
   FROM cte) p
UNPIVOT
   (Amount FOR [Type] IN 
      (A, B, C)
)AS unpvt;

输出:

ProductID   Amount      Type
----------- ----------- ----------- 
101         1           A
101         2           B
101         0           C
102         0           A
102         1           B
102         3           C
103         5           A
103         0           B
103         0           C

(9 row(s) affected)