【问题标题】:How to write a sql script that cursors through a table and inserts into a different table如何编写一个在表中游标并插入到不同表中的 sql 脚本
【发布时间】:2021-02-11 01:25:20
【问题描述】:

我是 sql server 的新手,我有以下包含一千多行的表结构。 但是出于示例目的,这就是它的样子

表格导入

+------+---------+------------+------------+------------+------------+------------+
| Name |  Code   | SocksTotal | GlovesTotal| JeansTotal | ShirtsTotal| shoesTotal |
+------+---------+------------+------------+------------+------------+------------+
| OT   |   45612 |          2 |          1 |          0 |          1 |          4 | 
| OT   |    1234 |          0 |          1 |          0 |          0 |          0 | 
| US   |    45896|          0 |          0 |          0 |          0 |          0 | 
+------+---------+------------+------------+------------+------------+------------+

然后是第二个名为 Items 的表

+------+---------+
| ID   |  Item   | 
+------+---------+
| 1    |   socks |
| 2    |   Gloves|
| 3    |   Jeans |
| 4    |   Shirts|
| 5    |   shoes |
+------+---------+

从上面的表中,我需要编写一个脚本,该脚本将插入到另一个名为 ImportItems_Summary 的表中。 预期的输出是

+------+---------+------------+------------+
| Id   |  Code   | Items_id   |Import_total|
+------+---------+------------+------------+
| 1    |   45612 |          1 |          2 |
| 2    |   45612 |          2 |          1 |
| 3    |   45612 |          4 |          1 |
| 4    |   45612 |          5 |          4 |
| 5    |   1234  |          2 |          1 |
+------+---------+------------+------------+

正如您在此处看到的,代码 45612 现在在 ImportItems_summary 表中有 4 个条目,其中项目不等于 0,并且 Items_id 链接到 Items 表 ID 列。

我怎样才能实现上述输出?.. 我阅读并看到光标可能会有所帮助,但我不确定如何实现这一点

【问题讨论】:

  • 为什么要在这里使用CURSOR? SQL 是一种基于集合的语言,因此使用 CURSOR,这是一种迭代方法,应该是最后一个选项之一,而不是第一个。
  • @Larnu 它不一定是光标,我只是不知道如何实现它,我认为光标会有所帮助
  • 您拥有的初始数据是非规范化的。这些是您唯一拥有的项目,还是您真的有 100 列用于所有不同项目名称的列?如果是这样,这些是否都遵循{ItemName}Total 的结构作为列名?修复原始桌子的设计是一种选择吗?应该认真考虑。
  • @Larnu 不,我不能对表格进行任何更改,这是它设置的格式,目前我只有 5 个项目,我不确定它们是否会是更多项目
  • 这是一个问题,因为您可以构建一个静态解决方案,但是,很快,当您添加一个新项目时,它不会缩放,并且项目不会不 考虑。另一种方法是使用动态 SQL 方法,但是,这不是介绍性的,您(我怀疑,并且尊重)将无法支持该解决方案。然而,修复设计可以消除这个问题。

标签: sql sql-server sql-insert unpivot lateral-join


【解决方案1】:

一种方法是使用cross apply将非规范化表的列反透视为行,然后将items表带上join,最后插入到目标表中:

insert into ImportItems_Summary (code, items_id, import_total)
select im.code, it.items_id, x.import_total
from import im
cross apply (values 
    ('socks',  sockstotal),
    ('gloves', glovestotal),
    ('jeans',  jeanstotal),
    ('shirts', shirtstotal),
    ('shoes',  shoestotal)
) x(item, import_total)
inner join items it on it.item = x.item

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    相关资源
    最近更新 更多