2009-02-20 55 views
2

我很感激一些帮助放在一起的SQL脚本从一个表复制数据到另一个。基本上我需要为源表中的每一行执行的操作是汇总列值并将它们存储到目标表中的单个列中。SQL脚本来聚合列值

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

因此,ColumnX需要像'ColumnA,ColumnB,ColumnC'之类的东西。

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

在此先感谢!

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

+0

是否在列表中显示了columnA,columnB,columnC? – 2009-02-20 06:28:45

回答

3

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

但是,如果向TableB添加一个额外的列(称为TableA_ID)并将结果插入到TableB中,速度会更快。您可以立即访问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表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 

SELECT * FROM表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 
0

假设: 表B存在

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

TableB无法存储TableA.ID – 2009-02-20 05:10:02

+0

您可以添加TableA.ID作为聚合的一部分,比如说在TableB.Columnx的末尾,并使用Right函数去除字符串末尾的值... – Fender 2009-02-20 05:15:15