2017-06-20 47 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 

,你可以看到,startend是同为row 1 and 4row 2 and 5。 但价值row with id 1 is 102, and that of 4 is pending

我想编写一个查询,看起来为同一startend另一次出现,然后更新列value到各自的开始和结束的值,如果是悬而未决。别的离开它

即 我想更新ID为4和5行的值列,并在列编号为1和2(待定向的相应值)

最终结果我是值寻找是这样的:

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

对于id为1的行,@GordonLinoff对于'start = 10和end = 20.2'有一个特殊的值(102),就像你看到的,在id为4的行中,开始和结束与第1行的相同,但值在第4行挂起。我想更新挂起到ID为1的行的值,因为在两行中,'开始和结束是相同的' – Shubham

回答

1

呦。 ü可以尝试像下面

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 
       ); 

其实,我想,你希望至少有一个行的'done'(你的问题并不清楚。如果是这样,那么添加t2.status = '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; 

在这种情况下,你可以使用sum(case when status = 'done' then 1 else 0 end) over (partition by start, end) as cnt代替count(*)

+0

先生,我编辑我的问题,实际上,状态改变价值,即。它可能包含任何整数。请检查 – Shubham

+0

@SRingne。 。 。在回答问题后改变问题是无礼的。你使答案无效,并且可以画下来。 –

+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; 
相关问题