2016-07-21 2 views
0

特定の列と別の表の列を比較する表があります。列が変更された場合は、最終的に「Notes」フィールドを変更して変更内容を通知する必要があります。複数の列が変更されている可能性があります。一連のIF文を使用してSQL変数を設定する

簡単に言えば、私は変数を宣言し、変更された変数でその変数を更新し、その変数で列を更新したいとします。

アクセスでは、これを非常に簡単に行うことができますが、これをSQLで無駄にするために2日間を費やしました。


Declare @NewUpdate nvarchar(max) 

If B.RCustNmbr <> A.RSQ_Custnmbr Set @NewUpdate = 'CustNmbr changed from ' & A.RSQ_Custnmbr & ' to ' & B.RCustNmbr & ', ' 

If B.RCustName <> A.RSQ_CUSTNAME Set @NewUpdate = **@NewUpdate** & 'CustName changed from ' & A.RSQ_CUSTNAME & ' to ' & B.RCustName & ', ' 

Update A 
Set A.[Notes] = @NewUpdate & " on today's date " & A.[Notes] *(to include notes that might've been there before)* 
From [Table1] A Inner Join [Table2] B on A.ID = B.ID 

その後、私は次のID用@NewUpdate変数をリセットしたいと思う(そう設定し@NewUpdate = NULL)


は、あなたがこれを取得するために正しい方向に私を指すことができます達成された? If文でAの&のBテーブルをどのように参照すればよいかわかりません。私はいくつかのことを試しました。


Declare @NewUpdate nvarchar(max) 

Set @NewUpdate = (Select 'CustName changed from ' + A.RSQ_CustName + ' to ' + B.RCustName + ', ' 
From [Customer Master List] A INNER JOIN [Customer Master List Changes TEMP] B ON A.ID = B.ID 
Where **A.ID = 566** and B.RCustName <> A.RSQ_CustName) 

(フォーマットされた上記のクエリ):これは、最も近い

Declare @NewUpdate nvarchar(max) 

Set @NewUpdate = 
    (Select 'CustName changed from ' + A.RSQ_CustName + ' to ' + B.RCustName + ', ' 
     From [Customer Master List] A 
INNER JOIN [Customer Master List Changes TEMP] B ON A.ID = B.ID 
Where A.ID = 566 and B.RCustName <> A.RSQ_CustName) 

しかし、私は1つのIDにそれを制限するために持っているか、私はエラーを取得するサブクエリが返さより1より大きい。サブクエリが、=、などに続く場合は、これは許可されません。これを何千ものレコードに対して行う必要があります。

+1

「条件1 THEN値1 WHEN条件2 THEN値2 ... ELSE値_デフォルトEND1」を見たことがありますか? –

+1

どのようなSQLのフレーバーを使用していますか? Microsoft SQL(TSQL)、Postgres、MySQL、Oracle(PLSQL)? SQLにはCASE文がありますが、SQLにはさまざまなオプションがあります(例えばトリガ) – Paurian

+0

ありがとうございます。 私はCase Whenを見てきましたが、変数を設定することでうまくいくことはありませんでした。私はそれらを他のコードで使っているので、最初にそれらを試しました。 はい、Microsoft SQL(TSQL)を使用しています。 –

答えて

0

使用UPDATE FROM

UPDATE Table 
SET Notes = R.Notes 
    From 
(
    Select 
     A.TableId 
     'CustName changed from ' + A.RSQ_CustName + ' to ' + B.RCustName + ', ' AS Notes 
    From 
     [Customer Master List] A INNER JOIN 
     [Customer Master List Changes TEMP] B ON A.ID = B.ID 
    Where 
     A.ID = 566 and 
     B.RCustName <> A.RSQ_CustName 
) R 
WHERE 
    Table.Id = R.TableId 
+0

これはうまくいくようですが、何千ものレコードでこれをやりたいのであれば(言い換えれば、IDのWhere句は必要ありません)?私はこの問題に戻るときにこれを見ていきます。私は現時点でAccessで処理しています。ご協力いただきありがとうございます! –

1

二つのテーブルが共通のキー列を持っていると仮定すると、変更内容を識別するために、このようなクエリを使用することができます。列が文字ベースでない場合は、CASTを使用する必要がありますが、これは基本的な考え方を示しています。

SELECT d.* 
    FROM (SELECT a.key, 
       CASE WHEN a.col1<>b.col1 
       THEN 'col1 changed from ' + a.col1 + ' to ' + b.col1 + ',' 
       ELSE '' 
       END 
       + CASE WHEN a.col2<>b.col2 
        THEN 'col2 changed from ' + a.col2 + ' to ' + b.col2 + ',' 
        ELSE '' 
       END AS diff 
      FROM a INNER JOIN b ON a.key = b.key) d 
WHERE d.diff <> '' 

これを独自のサブクエリとして使用して、その中にノートの列があるテーブルに参加することができます。元のテーブルの1つにメモ欄があるように聞こえました。

UPDATE a 
    SET a.note = n.diff 
    FROM a INNER JOIN (<above select>) n ON a.key = n.key 
+0

うーん...これは面白そうだ。私はこの問題に戻るときにもこれを試してみるつもりです。ありがとう! –

+0

これは更新中を除いて完全に機能しました... d.diffの代わりに、n.diffに変更しました。そう... UPDATE a SET a.note = n.diff INNER JOIN(<上の選択>)からn ON a.key = n.key –

+1

これは申し訳ありませんが、SELECTから取り上げました。私は解決策を読んでいる人たちのために修正しました。 – vr8ce

関連する問題