2013-03-05 137 views
1

當前的表格未針對增長進行設置,我想將現有數據遷移到更適合擴展的表格。讓我來解釋:如何將一張表中的記錄插入第二張表

當前表設置,如:

+--------+---------------+----+----+----+------+-----------+ 
|  id | DateOfService | AM | MD | PM | RATE | CLIENT_ID | 
+--------+---------------+----+----+----+------+-----------+ 
|  1 | 3/4/2013  | 1 | 0 | 0 | 10 |  123 | 
|  2 | 3/5/2013  | 1 | 0 | 0 | 10 |  123 | 
|  3 | 3/6/2013  | 1 | 0 | 0 | 10 |  123 | 
|  4 | 3/5/2013  | 0 | 1 | 1 | 50 |  147 | 
|  5 | 3/6/2013  | 1 | 1 | 1 | 25 |  189 | 
+--------+---------------+----+----+----+------+-----------+ 

,而是,我想設置我的表像:

+----------+---------------+---------------+-----------+ 
|  pkid | DateOfService | ServiceTypeID | CLIENT_ID | 
+----------+---------------+---------------+-----------+ 
|  1 | 3/4/2013  |    1 |  123 | 
|  2 | 3/5/2013  |    1 |  123 | 
|  3 | 3/6/2013  |    1 |  123 | 
|  4 | 3/5/2013  |    2 |  147 | 
|  5 | 3/5/2013  |    3 |  147 | 
|  6 | 3/6/2013  |    1 |  189 | 
|  7 | 3/6/2013  |    2 |  189 | 
|  8 | 3/6/2013  |    3 |  189 | 
+----------+---------------+---------------+-----------+ 

的ServiceTypeID表將是一個options表設置的東西像:

+-------------------+---------+ 
|  ServiceTypeID | Service | 
+-------------------+---------+ 
|     1 | AM  | 
|     2 | MD  | 
|     3 | PM  | 
+-------------------+---------+ 

我需要幫助提出一個查詢我可以運行,將seleclec t並遍歷現有數據並填充我的新表。

+0

我不明白pkid來自何處 – Hogan 2013-03-05 03:04:51

+0

@hogan您的誤解是有道理的。我沒有正確輸入數值。感謝您的支持。我更新了示例pkid值。 – HPWD 2013-03-05 04:13:26

回答

0

因爲你的選擇表 「設置」,像這樣的工作:

INSERT INTO newtable 
    SELECT id, dateofservice, 1, clientid 
    FROM oldTable 
    WHERE AM = 1 
    UNION ALL 
    SELECT id, dateofservice, 2, clientid 
    FROM oldTable 
    WHERE MD = 1 
    UNION ALL 
    SELECT id, dateofservice, 3, clientid 
    FROM oldTable 
    WHERE PM = 1 

NB,我m使相同的假設藍色是,你的示例表是錯誤的,pk應該有值1,2,3,4,4,5,5,5

如果你想要該鍵是唯一的,那麼j ust將其定義爲自動遞增鍵,並且不要將其包含在此選擇中。

+0

謝謝Hogan,你在這裏提出的想法正是我所期待的。 – HPWD 2013-03-05 04:50:12

1

您可以使用UNPIVOT函數將當前表格從列變爲行。然後,您可以加入您的options表格並將數據插入到您的新表格中。

UNPIVOT代碼將是:

select id, 
    dateofservice, 
    client_id, 
    col, 
    value 
from yourtable 
unpivot 
(
    value 
    for col in (AM, MD, PM) 
) unpiv 
where value <> 0 

SQL Fiddle with Demo

然後,你將加入到你的options表得到的結果。您可以使用此查詢INSERT INTO新表:

-- INSERT INTO yourNewTable 
select src.id as pkid, 
    src.dateofservice, 
    o.servicetypeid, 
    src.client_id 
from 
(
    select id, 
    dateofservice, 
    client_id, 
    col, 
    value 
    from yourtable 
    unpivot 
    (
    value 
    for col in (AM, MD, PM) 
) unpiv 
    where value <> 0 
) src 
inner join options o 
    on src.col = o.service 

SQL Fiddle with Demo

+0

這似乎是一個趨勢,我把一個簡單的解決方案,接近答案,你把一個確切的複雜。接下來,隨着時間的流逝,每個人都告訴我我的錯誤:)祝你有個美好的夜晚。 – Hogan 2013-03-05 03:14:29

+1

@Hogan我沒有看到你的解決方案有什麼問題。我只是喜歡用'pivot'和'unpivot'來解決問題(你會在我的個人資料中看到)。我還使用了一個連接讓代碼獲得'servicetypeid'而不是對它們進行硬編碼以防止胖手指輸入錯誤。 ':'' – Taryn 2013-03-05 03:16:38

+0

@bluefeet我喜歡你提供的例子,但是我可能太綠了,無法使用pivot和unpivot(以前從未聽說過unpivot)。但是SQL小提琴非常棒!我一定會嘗試一下。 – HPWD 2013-03-05 04:20:21

相關問題