2017-07-11 19 views
0

私の最初のレコードを持つtable1があります。私はtable2を持っていて、それはtable1と同じテーブル構造を含んでいます。 Table2トランザクションは、table1の値を更新するために使用されます。私がやろうとしています何を説明するためにSQL Server 2012:更新前にt1.field1値とt2.field1値を比較します。

、私は彼らがnullのときのフィールドにうまく動作します。このコードを持っている:

UPDATE TABLE1 
SET FIELD1 = CASE WHEN T1.FIELD1 = '' THEN t2.FIELD1 ELSE T1.FIELD1 END, 
    FIELD2 = CASE WHEN T1.FIELD2 = '' THEN T2.FIELD2 ELSE T1.FIELD2 END, 
    FIELD3 = CASE WHEN T1.FIELD3 = '' THEN T2.FIELD3 ELSE T1.FIELD3 END, 
FROM TABLE1 T1 
JOIN TABLE2 T2 ON T1.COMMONFIELD = T2.COMMONFIELD 
GO 

しかし、同じことを行う方法はありますが、t2.field1t1.field1値を比較します同じ種類の論理を持つ価値?私は、それぞれが、それは更新前の基準を比較する独自のしているt2.field-n値にt1.field-n値を比較できるようにしたい

UPDATE TABLE1 
SET FIELD1 = CASE WHEN T1.FIELD1 > t2.field1 THEN t2.FIELD1 ELSE T1.FIELD1 END, 
    FIELD2 = CASE WHEN T1.FIELD2 < t2.field2 THEN T2.FIELD2 ELSE T1.FIELD2 END, 
    FIELD3 = CASE WHEN T1.FIELD3 = '' THEN T2.FIELD3 ELSE T1.FIELD3 END, 
FROM TABLE1 T1 
JOIN TABLE2 T2 ON T1.COMMONFIELD = T2.COMMONFIELD 
GO 

:これは、類似したコードとコンセプトだろう。このアプローチではない場合、T-SQLを別の方法で使用することは可能ですか?

ありがとうございます!

+0

あなたの質問は理にかなっていません。あなたの最初のクエリは明示的に 'NULL'sを処理しないので、なぜあなたがそれをうまく処理すると思うか分かりません。論理は明確ではありません。サンプルデータと望ましい結果が役立ちます。 –

+0

ありがとうゴードン。あなたは正しいです。スペースを処理します。フォーマットをしていただきありがとうございます。その方法に関する情報はどこにありますか? – user2704985

+0

2番目のクエリで比較ロジックを実行するには、関数 'least()'と 'greatest()'を作成することができます。これらの関数は、SQL Serverではなく、複数のDBMSに存在します。 –

答えて

0

これはまさに答えではないですが、私はあなたの最初のクエリがあることを期待する:

UPDATE T1 
    SET FIELD1 = COALESCE(T2.FIELD1, T1.FIELD1), 
     FIELD2 = COALESCE(T2.FIELD2, T1.FIELD2), 
     FIELD3 = COALESCE(T2.FIELD3, T1.FIELD3) 
FROM TABLE1 T1 JOIN 
    TABLE2 T2 
    ON T1.COMMONFIELD = T2.COMMONFIELD; 

TABLE2内の対応するフィールドがNOT NULLあるときこれは、TABLE1を更新します。あなたの質問の残りの部分についてはわかりませんが、最初のクエリで分かりやすいやり方をすることもできます。

+0

全体的なプロセスは、共通の行のグループを結合し、マスターレコードを作成することです。空白または空白のフィールドには、値を持つ別のテーブルの対応する類似フィールドが入力されます。私は、t1.field1にスペースがあるかどうかを調べることができるアップデート内のcaseステートメントにもっと焦点を当てていました。もしそうなら、t2.field1で更新してください。しかし、2つの値をお互いに比較したい場合はどうでしょうか。また、field1の更新ルールはfield2の更新ルールとは異なります。 60フィールド、150万レコードあります。 – user2704985

0

私は次はあなたを助けたりしませんかどうかわからないです:

declare @t1 table (val1 varchar(100), val2 varchar(100), common_field int) 
declare @t2 table (val1 varchar(100), val2 varchar(100), common_field int) 

insert into @t1 
select 'abc', 'first', 1 union select '', 'second', 2 union select 'xyz', '', 3 union select '', '', 4 

insert into @t2 
select '', 'NEW_FIRST', 1 union select 'NEW', 'NEW_2', 2 union select 'not_old', 'NEW_SECOND', 3 union select 'PQR_NEW', 'ALL_NEW', 4 

select t1.common_field, t1.val1 val1_1, t2.val1 val1_2, 
coalesce(nullif(t1.val1, ''), t2.val1) update_value_for_val1, 
t1.val2 val2_1, t2.val2 val2_2, 
coalesce(nullif(t1.val2, ''), t2.val2) update_value_for_val2 
from @t1 t1 
join @t2 t2 on t1.common_field = t2.common_field 
order by 1 

感謝。

関連する問題