0

私は2つのテーブルを持っています

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 に t1 の cid が含まれていない場合、新しいレコードが t2 に挿入され、t1.cid、t1.isnews はt2.. に挿入されます。

完全なテーブルは単一のクエリで実行する必要があります...更新部分は実行しましたが、挿入部分を実行できません..

更新クエリ:

 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
4

2 に答える 2

1

これはあなたが求めているものだと思います:

--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 を単独で実行して、正しい結果が得られることを確認することをお勧めします (t2 に一致する cid がない t1 のすべてのレコード)。

t2.nid は IDENTITY 列であると想定しています。

于 2010-02-01T10:35:21.947 に答える
0

カーソルを使用しない方がはるかに優れています:) カーソルは、大規模なデータセットで実行するのにはるかに時間がかかります。

確かに LEFT JOIN を使用できますが、WHERE 句で SELECT を使用することもできます。ほとんどの場合、それはスタイルの選択です。

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) 
于 2013-03-29T00:05:42.320 に答える