SQL-скрипт для агрегирования значений столбцов - PullRequest
2 голосов
/ 20 февраля 2009

Буду признателен за помощь в создании сценария 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.

Ответы [ 2 ]

3 голосов
/ 20 февраля 2009

Вот пример построчной обработки. Это предоставит вам результаты таким образом, чтобы вы могли обрабатывать каждую строку одновременно. Или вы можете использовать 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

SELECT * FROM TableB

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

ВЫБРАТЬ * ИЗ СТОЛБА C

TableA_ID   TableB_ID
----------- -----------
1           1
2           2
3           3
11          4
12          5
13          6
21          7
22          8
23          9
0 голосов
/ 20 февраля 2009

Предполагая, что: Таблица B существует

INSERT INTO TableB (ColumnX)
SELECT [TableA]![ColumnA]+","+[TableA]![ColumnB]+","+[TableA]![ColumnC] AS ColumnX
FROM TableA;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...