2013-03-28 106 views
1

更新不同的列我有一個像下面的要求。根據從另一個表值SQL

我有放在一個列中的所有字符表,我需要利用這些信息創建一個具有每個字符一個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 

我們可以有兩個內部連接,但如果有更多的列的話,我將很難做到這一點。有沒有一個簡單的方法來做到這一點?

在此先感謝您的幫助。

+2

什麼[RDBMS](http://en.wikipedia.org/wiki/ Relational_database_management_system)您使用的? 'RDBMS'代表*關係數據庫管理系統*。 'RDBMS是SQL'的基礎,像MS SQL服務器,IBM DB2,Oracle,MySQL等,等... – 2013-03-28 05:15:46

+0

和我所有現代數據庫系統認爲你的意思是'不INSERT''UPDATE'。 – 2013-03-28 05:27:13

回答

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 
0

而不是建立一個單一的花哨查詢「所有這一切」,它的簡單和清晰,以創建單獨的小查詢 - 每個類型的更新。

這樣做有以下好處:

  • 更好的維護 - 增加一個新類型的自定義映射,或更改現有容易
  • 它更清晰和易於理解的 - 清晰度的基石良好的編程
  • 測試是容易得多,因爲你的變化是集小,凝聚力
+0

@evan它的上邊緣。我把它變成一個答案... – Bohemian 2013-03-28 05:27:47

0

您可以使用支點最大(值)。集團通過爲 '支點' 你的表,然後用INSERT 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