SSMS / TSQL - вставка нескольких записей для каждой записи, найденной в запросе

Я хочу вставить несколько записей (две, чтобы быть конкретными) с уникальным идентификатором для столбца 1 (в обеих созданных записях) для каждой записи, которая соответствует определенным критериям запроса. Остальные значения для вставки следует извлечь из соответствующих столбцов запроса. В первой вставке Column2 будет исходным значением из Column1, а во второй вставке Column2 будет исходным значением из Column2.

В идеале мне нужно:

FIND RECORDS THAT MEETS CRITERIA
FOR EACH RECORD
GENERATE GUID
INSERT TWO NEW RECORDS WITH GUID AS COLUMN1, AND REMAINING COULMNS FROM 
CURRENT RECORD FOUND

RECORDS
123 abc 3 4 5
456 def 6 7 8

RECORD 1
123 abc 3 4 5

NEW RECORDS AFTER INSERTS
UID1 123 3 4 5
UID1 abc 3 4 5

ROW 2
456 def 6 7 8

NEW RECORDS AFTER INSERTS
UID2 456 6 7 8
UID2 def 6 7 8

Приведенный ниже INSERT SELECT FROM обрабатывает именно то, что я хочу сделать, но только для одной вставки для каждой найденной записи.

INSERT INTO table1
( 
    Column1,
    Column2,
    Column3
    Column4
    Column5
)
SELECT
    NEWID(), -- unique ID
    Column2, -- or Column1 based on which insert we are doing
    Column3, -- always column 3
    Column4, --always column 4
    Column5 -- always column 5
FROM
    table1
WHERE Column1 IS NOT NULL
AND Column1 != Column4

Есть ли простой способ сделать это через TSQL? Мне нужно, чтобы он запускался массово, так как потенциально тысячи записей удовлетворяют условиям запроса.


person bacis09    schedule 03.10.2017    source источник
comment
Вы хотите, чтобы каждая пара строк имела одинаковый NEWID?   -  person SQLChao    schedule 03.10.2017
comment
Да, одинаковый сгенерированный идентификатор для каждой пары созданных записей. Здесь цель состоит в том, чтобы разделить исходные данные на две записи и использовать сгенерированный идентификатор для их связывания.   -  person bacis09    schedule 04.10.2017


Ответы (2)


Вот возможность. Сначала используйте запрос, который генерирует первый набор строк, и вставьте их во временную таблицу.

Демонстрация Rextester

SELECT 
    NEWID() AS [uid], -- unique ID
    column1,
    Column2, -- or Column1 based on which insert we are doing
    Column3, -- always column 3
    Column4, --always column 4
    Column5 -- always column 5
INTO #temp
FROM
    table1
WHERE Column1 IS NOT NULL
AND Column1 != Column4

Теперь, используя эту временную таблицу, мы можем сделать UNION с той же таблицей, чтобы сгенерировать второй набор строк и вставить их в table1.

INSERT INTO table1
SELECT 
    [uid] AS Column1
  , CAST(column1 AS NVARCHAR(3)) AS Column2
  , column3 
  , column4
  , column5
FROM #temp
UNION ALL
SELECT 
    [uid] AS Column1
  , column2
  , column3 
  , column4
  , column5
FROM #temp
ORDER BY Column1

DROP TABLE #temp
person SQLChao    schedule 04.10.2017

person    schedule
comment
Похоже, что это создает UUID для каждой вставленной записи. Думаю, мне следует пояснить, что это действительно УНИКАЛЬНО только для каждого набора вставленных записей. Один UUID для обеих вставок. В противном случае он выполнил то, к чему я стремился. Вы можете мне объяснить, что такое оператор with xQ? Я быстро поискал, но не нашел никакой документации по этому поводу. - person bacis09; 04.10.2017
comment
Я использовал CTE (общее табличное выражение) на сервере sql для создания уникального идентификатора для каждой записи, возвращаемой по критериям, затем я использовал этот результат дважды - person Bijan Ghasemi; 05.10.2017