用于聚合列值的SQL脚本

时间:2009-02-20 04:49:48

标签: sql sql-server

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

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

所以,ColumnX需要类似'ColumnA,ColumnB,ColumnC'。

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

提前感谢!

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

2 个答案:

答案 0 :(得分:3)

这是一个逐行处理示例。这将以一种可以一次处理每一行的方式为您提供结果。或者您可以在最后使用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

SELECT * FROM TableA

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

SELECT * FROM TableB

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

答案 1 :(得分:0)

假设:    TableB存在

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