如何将一张表中的记录插入到第二张表中
Posted
技术标签:
【中文标题】如何将一张表中的记录插入到第二张表中【英文标题】:How can I insert records from one table into second table 【发布时间】:2013-03-05 02:48:22 【问题描述】:当前表不是为增长而设置的,我想将现有数据迁移到更适合扩展的表中。让我解释一下:
当前表设置如下:
+--------+---------------+----+----+----+------+-----------+
| 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 |
+-------------------+---------+
我需要帮助提出一个可以运行的查询,该查询将选择并循环现有数据并填充我的新表。
【问题讨论】:
我不明白 pkid 是从哪里来的 @hogan 你的误解是有道理的。我没有正确输入数值。谢谢你抓住那个。我已经更新了示例 pkid 值。 【参考方案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
【讨论】:
这似乎是一种趋势,我提出了一个接近答案的简单解决方案,而您提出了一个完全复杂的解决方案。接下来,随着时间的推移,每个人都告诉我我的错误。 :) 祝你有个美好的夜晚。 @Hogan 我认为您的解决方案没有任何问题。我只是更喜欢使用pivot
和unpivot
来解决问题(你会在我的个人资料中看到)。我还使用连接来让代码获得servicetypeid
,而不是对它们进行硬编码以防止粗手指输入错误。 :)
@bluefeet 我喜欢你提供的示例,但我可能对使用 pivot 和 unpivot 太陌生(以前甚至从未听说过 unpivot)。但是 SQL Fiddle 非常棒!不过我一定会尝试的。【参考方案2】:
由于您的选项表是“设置”,因此可以使用以下方法:
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
注意,我在做同样的假设,蓝色是,您的示例表是错误的,pk 应该具有值 1,2,3,4,4,5,5,5
如果您希望该键是唯一的,则只需将其定义为自动增量键,并且不要将其包含在此选择中。
【讨论】:
谢谢霍根,你在这里提出的想法正是我想要的。以上是关于如何将一张表中的记录插入到第二张表中的主要内容,如果未能解决你的问题,请参考以下文章
如果ID存在于第二张或第三张表中,如何从第一张表中高效选择?
在 MySQL 中,如何将一张表的内容复制到同一个数据库中的另一张表中?
在 MySQL 中,如何将一张表的内容复制到同一个数据库中的另一张表中?