2016-10-05 5 views
0

CTEからのデータでPersons2の行全体を更新する作業をしています。このアクションを実行する最も簡単な方法は何でしょうか?SQL ServerのCTEからの新しいデータを含むテーブルの更新

私が使用しているコードは以下の通りです。Persons1Persons2テーブルを使用しているCTEからデータを取得しています。結果が得られたら、私はPersons2にデータ全体(行)を挿入したい(Persons2の前のデータは必要ない)。

ケース1:私はこれをやっている場合は、重複したデータがPersons2に追加された(それだけでアウトを行う削除して新しいデータを挿入され、コマンドはここに私を許可していません削除)

あなたのソリューションがあります私にとって最も貴重な、ありがとう。

;WITH tabtemp AS 
 
(
 
    SELECT 
 
     COALESCE(p1.id, p2.id) AS ID, 
 
     COALESCE(p1.name, p2.name) AS Name, 
 
     COALESCE(p1.phnumber, p2.phnumber) AS PHNumber, 
 
     CASE 
 
      WHEN p1.name IS NULL THEN 0 
 
      ELSE 1 
 
     END AS IsActive 
 
    FROM 
 
     Persons1 p1 
 
    FULL JOIN 
 
     Persons2 p2 ON p1.name = p2.name 
 
        AND p1.phnumber = p2.phnumber) 
 
INSERT INTO Persons2 (ID, Name, PHNumber, IsActive) 
 
    SELECT * 
 
    FROM tabtemp

+0

なぜp2データが存在する場合は、挿入の代わりに更新を使用しますか? –

+0

[MERGE(2008+)について読む](https://msdn.microsoft.com/en-us/library/bb510625.aspx) – Shnugo

答えて

0

だから、実際に、あなたはP2ではないすでにP1に新たなデータを追加する必要があります。 条件が吹いた場合は追加:

;WITH tabtemp AS (SELECT 
    COALESCE(p1.id, p2.id) AS ID, 
    COALESCE(p1.name, p2.name) AS Name, 
    COALESCE(p1.phnumber, p2.phnumber) AS PHNumber, 
    CASE WHEN p1.name IS NULL THEN 0 ELSE 1 END AS IsActive 
FROM Persons1 p1 
FULL JOIN persons2 p2 
    ON p1.name = p2.name 
    AND p1.phnumber = p2.phnumber) 
Insert Into Persons2(ID,Name,PHNumber,IsActive) 
SELECT * FROM tab temp 

where p2.id is null -- Added 

あなたはまた、MERGEステートメントを使用することができます。

+0

しかし、これは既存の行を更新しません。 p2の1つの列が値を持つ'NULL 'の場合、これは更新する必要があります(少なくとも私はそう仮定します...) – Shnugo

+0

p2に存在しないレコードは、すでにレコードに追加されますp2。 –

+0

これがすべてのOPのニーズであれば、シンプルな '存在しない(...)'で簡単だった – Shnugo

関連する問題