【问题标题】:SQL script to aggregate column values聚合列值的 SQL 脚本
【发布时间】:2009-02-20 04:49:48
【问题描述】:

我希望能帮我整理一个 sql 脚本以将数据从一个表复制到另一个表。基本上我需要为源表中的每一行做的是聚合列值并将它们存储到目标表中的单个列中。

TableA: ID, ColumnA, ColumnB, ColumnC
TableB: Identity, ColumnX

所以,ColumnX 需要类似于“ColumnA, ColumnB, ColumnC”。

此外,我需要跟踪每个 TableA.ID -> SCOPE_IDENTITY() 映射以更新第三个表。

提前致谢!

编辑:TableA.ID 与 TableB.Identity 不同。 TableB.Identity 将在插入时返回一个新的标识值。所以要么我需要将映射存储在临时表中,要么在每次插入 TableB 时更新 TableC。

【问题讨论】:

  • 整个表格中 columnA、columnB、columnC 是否不同?

标签: sql sql-server


【解决方案1】:

这是一个逐行处理的例子。这将以一种您可以一次处理每一行的方式为您提供结果。或者您可以在最后使用 TableC 并执行您需要执行的任何处理。

但是,如果您在 TableB 中添加一个额外的列(称为 TableA_ID)并将结果插入其中,则速度会快很多。您可以立即访问 TableA.ID 和 TableB.Identity。但在不了解您的具体情况的情况下,这可能不可行。 (但您可以随时添加列,然后再将其删除!)

USE tempdb
GO

CREATE TABLE TableA (
    ID int NOT NULL PRIMARY KEY,
    ColumnA varchar(10) NOT NULL,
    ColumnB varchar(10) NOT NULL,
    ColumnC varchar(10) NOT NULL
)

CREATE TABLE TableB (
    [Identity]  int IDENTITY(1,1) NOT NULL PRIMARY KEY,
    ColumnX varchar(30) NOT NULL
)

CREATE TABLE TableC (
    TableA_ID  int NOT NULL,
    TableB_ID  int NOT NULL,
    PRIMARY KEY (TableA_ID, TableB_ID)
)

GO

INSERT INTO TableA VALUES (1, 'A', 'A', 'A')
INSERT INTO TableA VALUES (2, 'A', 'A', 'B')
INSERT INTO TableA VALUES (3, 'A', 'A', 'C')
INSERT INTO TableA VALUES (11, 'A', 'B', 'A')
INSERT INTO TableA VALUES (12, 'A', 'B', 'B')
INSERT INTO TableA VALUES (13, 'A', 'B', 'C')
INSERT INTO TableA VALUES (21, 'A', 'C', 'A')
INSERT INTO TableA VALUES (22, 'A', 'C', 'B')
INSERT INTO TableA VALUES (23, 'A', 'C', 'C')
GO

-- Do row-by-row processing to get the desired results
SET NOCOUNT ON
DECLARE @TableA_ID int
DECLARE @TableB_Identity int
DECLARE @ColumnX varchar(100)

SET @TableA_ID = 0

WHILE 1=1 BEGIN

  -- Get the next row to process
  SELECT TOP 1 
    @TableA_ID=ID,
    @ColumnX = ColumnA + ColumnB + ColumnC
  FROM TableA
  WHERE ID > @TableA_ID

  -- Check if we are all done
  IF @@ROWCOUNT = 0
    BREAK

  -- Insert row into TableB
  INSERT INTO TableB (ColumnX)
    SELECT @ColumnX

  -- Get the identity of the new row
  SET @TableB_Identity = SCOPE_IDENTITY()

  -- At this point, you have @TableA_ID and @TableB_Identity.
  -- Go to town with whatever extra processing you need to do
  INSERT INTO TableC (TableA_ID, TableB_ID)
    SELECT @TableA_ID, @TableB_Identity

END
GO

SELECT * FROM TableC
GO

从表 A 中选择 *

ID          ColumnA    ColumnB    ColumnC
----------- ---------- ---------- ----------
1           A          A          A
2           A          A          B
3           A          A          C
11          A          B          A
12          A          B          B
13          A          B          C
21          A          C          A
22          A          C          B
23          A          C          C

从表 B 中选择 *

Identity    ColumnX
----------- ------------------------------
1           AAA
2           AAB
3           AAC
4           ABA
5           ABB
6           ABC
7           ACA
8           ACB
9           ACC

SELECT * FROM TableC

TableA_ID   TableB_ID
----------- -----------
1           1
2           2
3           3
11          4
12          5
13          6
21          7
22          8
23          9

【讨论】:

    【解决方案2】:

    假设: 表B存在

    INSERT INTO TableB (ColumnX)
    SELECT [TableA]![ColumnA]+","+[TableA]![ColumnB]+","+[TableA]![ColumnC] AS ColumnX
    FROM TableA;
    

    【讨论】:

    • 您可以将 TableA.ID 添加为聚合的一部分,例如在 TableB.Columnx 的末尾,并使用 Right 函数去除字符串末尾的值...
    猜你喜欢
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    • 1970-01-01
    • 2021-01-15
    • 1970-01-01
    相关资源
    最近更新 更多