пожалуйста, помогите мне создать мульти вставку запроса - PullRequest
0 голосов
/ 01 февраля 2010

У меня есть два стола

create table t1(cid int, isnews int)

create table t2(nid int,cid int, isnews int)

ситуации таковы: если t2 содержит t2.cid = t1.cid, то t2.isnews = t1.news и если t2 не содержит cid из t1, то в t2 должна быть вставлена ​​новая запись, а в t2 должны быть вставлены t1.cid, t1.isnews

и полная таблица должна быть сделана в одном запросе ... Я выполнил обновление, но не смог выполнить вставку.

запрос на обновление:

 UPDATE    t22
SET       t22.isnews = t11.isnews 
FROM      t2 AS t22
    JOIN  t1 AS t11
    ON  t11.cid= t22.cid

Я подготовил курсор ниже для вставки ... это хорошо? :

DECLARE @clntid INT
DECLARE @clntnewsltr INT
DECLARE clientnews CURSOR FOR 
SELECT clientid,newsLetter 
FROM clients 
WHERE clientid NOT IN (SELECT clientid FROM clientprivacy) 

OPEN clientnews  
FETCH NEXT FROM clientnews INTO @clntid,@clntnewsltr  

WHILE @@FETCH_STATUS = 0  
BEGIN  

   INSERT INTO clientprivacy (clientId,tdNewsLetters) VALUES(@clntid, @clntnewsltr)
 FETCH NEXT FROM clientnews INTO @clntid,@clntnewsltr  
END  

CLOSE clientnews  
DEALLOCATE clientnews

Ответы [ 2 ]

1 голос
/ 01 февраля 2010

Я думаю, что это то, что вы ищете:

--INSERT t2 (cid, isnews)
SELECT t1.cid, t1.isnews
FROM t1
    LEFT JOIN t2 ON t1.cid = t2.cid
WHERE t2.cid IS NULL

Я прокомментировал строку INSERT - я рекомендую вам сначала запустить SELECT самостоятельно, чтобы убедиться, что он дает правильный результат (все записи из t1, у которых нет соответствующего cid в t2).

Я предположил, что t2.nid является столбцом IDENTITY.

0 голосов
/ 29 марта 2013

Без курсоров вам будет намного лучше :) Курсорам требуется гораздо больше времени для работы с большими наборами данных.

Это правда, что вы можете использовать LEFT JOIN, но вы также можете использовать SELECT в вашем предложении WHERE. В большинстве случаев это выбор стиля.

CREATE TABLE table1(col_1 int, col_2 int)
CREATE TABLE table2(nid int, col_1 int, col_2 int)


INSERT INTO table2 (col_1,col_2) 
SELECT col_1,col_2 
FROM table1 
WHERE col_1 NOT IN (SELECT col_1 FROM table2) 
...