2017-06-20 17 views
1

私はSQL Serverにテーブルを持っています。同じテーブルの値を使用してSQLテーブルの値を更新

id start end  value flag 
1  10  20.2 102  T 
2  22  11  133  T 
3  12.1 15  pending F 
4  10  20.2 pending F 
5  22  11  pending F 

あなたが見ることができるように、startendrow 1 and 4、およびrow 2 and 5でも同じです。 しかしrow with id 1 is 102, and that of 4 is pendingの値は、

私はそれが保留されている場合は、同じstartendの別のoccuranceを探している、クエリを記述して、それぞれの開始と終了の値に列valueを更新したいです。他の私は、ID 1および2(それぞれの値にペンディング)私は

最終結果と行の値と、ID 4および5を持つ行の値列を更新する すなわち

それを残します探しているのはこれです:

id start end  value flag 
1  10  20.2 102  T 
2  22  11  133  T 
3  12.1 15  pending F 
4  10  20.2 102  F 
5  22  11  133  F 
+0

「完了」を削除します。 –

+0

id1の行の@GordonLinoff、 'start = 10とend = 20.2'には特定の値(102)があります。これは、ID 4の行で、行1の開始と終了と同じです値は行4に保留中です。両方の行で '開始と終了が同じです ' – Shubham

答えて

1

ヨ。 uがあなたのために

以下
update t1 
set t1.value=t2.value 
from tbl t1 
join 
tbl t2 on 
t1.start=t2.start and t1.end=t2.end and t2.value not like 'pending' 
and t1.value like 'pending' 

ようなクエリを試すことができ、私はまた、その後の旗の列を更新するhavd場合

コメント?

ことだとちょうど私はゴードンクエリを変更してい

update t1 
set t1.value=t2.value, 
t1.flag=t2.flag 
from tbl t1 
join 
tbl t2 on 
t1.start=t2.start and t1.end=t2.end and t2.value not like 'pending' 
and t1.value like 'pending' 
1

これは私が理解した質問の最初のバージョンに対応しています。

update t 
    set status = 'done' 
    where status = 'pending' and 
      exists (select 1 
        from t t2 
        where t2.start = t.start and t2.end = t.end and 
         t2.id <> t.id 
       ); 

実は、私は

。もしそうなら、サブクエリに t2.status = 'done'を追加します。(あなたの質問が明確ではありませんあなたは、少なくとも1行が 'done'になりたいと仮定または、SQL Serverで、あなたが使用することができます更新可能なCTE:

with toupdate as (
     select t.*, count(*) over (partition by start, end) as cnt 
     from t 
    ) 
update toupdate 
    set status = 'done' 
    where status <> 'done' and cnt > 1; 

この場合は、あなたがcount(*)の代わりにsum(case when status = 'done' then 1 else 0 end) over (partition by start, end) as cntを使用することになり

+0

先生、私の質問を編集しましたが、実際にはステータスが変更されているので、ID 1の行の値に保留を更新します。すなわち、値にする。任意の整数を含むことができます。 @SRingneを – Shubham

+0

にチェックしてください。 。 。答えると質問を変えるのは失礼です。あなたは回答を無効にし、それは下降線を描くことができます。 –

+0

私はちょうど質問を編集していた、私は非常に残念ですが、あなたの答えを編集中に来た。これは私のための非常に複雑なクエリのようです、私は初心者です – Shubham

0

このバージョンを試してみてくださいあなたが質問

クエリ1のために得ることができる最高の答えです:

update t 
     set status = 

t.value >>削除 '完了'

where status = 'pending' and 
      exists (select 1 
        from t t2 
        where t2.start = t.start and t2.end = t.end and 
         t2.id <> t.id 
       ); 

クエリ2

with toupdate as (
      select t.*, count(*) over (partition by start, end) as cnt 
      from t 
     ) 
    update T 
     set status = 

T.バリュー>>私もあなたが質問に対して行った変更を理解していない

From toupdate 
     where status <> 'done' and cnt > 1; 
関連する問題