1

我有如下要求。

我有一张表,所有字符都放在一列中,我需要使用这些信息创建一个表,每个字符都有一个 olumn。

示例: 源表:

article id | char id | char value
1          | 1       | book
1          | 2       | yes
1          | 3       | 100
2          | 1       | cd
2          | 2       | No

目的地表

article id | type | lendable | number of pages 
1          | book | yes      | 100
2          | cd   | no       | NULL

我们可以用两个内部连接来做到这一点,但如果有更多的列,那么我会很困难。有没有直接的方法来做到这一点?

在此先感谢您的帮助。

4

3 回答 3

0

这可以简单地使用INSERT INTO..SELECT.

INSERT INTO destinationTable(articleid, type, lendable, NumberOfPages)
SELECT  ArticleID,
        MAX(CASE WHEN charID = 1 THEN charValue END) type,
        MAX(CASE WHEN charID = 2 THEN charValue END) lendable,
        MAX(CASE WHEN charID = 3 THEN charValue END) NumberOfPages
FROM    SourceTable 
GROUP   BY ArticleID
于 2013-03-28T05:19:40.450 回答
0

与其构建一个“完成所有工作”的单一查询,不如创建单独的小查询更简单、更清晰——每种类型的更新一个查询。

这样做有以下好处:

  • 更好的维护 - 添加另一种新类型的自定义映射或更改现有映射很容易
  • 它更清晰易懂 - 清晰是良好编程的基石
  • 测试更容易,因为您的变更集更小且具有凝聚力
于 2013-03-28T05:21:42.910 回答
0

您可以使用pivotMax(value)..Group by来“透视”您的表,然后使用Insert into select..Select * into...
PIVOT SQL FIDDLE DEMO


with CTE_SourceTable
as 
(
  select article_id, [1] as type, [2] as lendable, [3] as [number of pages]
  from SourceTable
  pivot
  (
    max(char_value)
    for char_id in ([1],[2],[3])
   ) as PVT
)
select * 
into DestinationTable 
from CTE_SourceTable

Max(value)..Group By SQL FIDDLE DEMO


with CTE_SourceTable
as 
(
  select article_id, [1] as type, [2] as lendable, [3] as [number of pages]
  from SourceTable
  pivot
  (
    max(char_value)
    for char_id in ([1],[2],[3])
   ) as PVT
)
select *
into DestinationTable
from CTE_SourceTable
于 2013-03-28T07:17:30.413 回答