使用同一个表中的值更新sql表的值

时间:2017-06-20 10:48:32

标签: sql sql-server

我在sql server中有一个表。

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 4row 2 and 5相同。 但值row with id 1 is 102, and that of 4 is pending

我想编写一个查询,查找同一个startend的另一个问题,然后将列value更新为相应的开始和结束的值,如果是悬而未决。别的吧呢

即 我想更新id为4和5的行的value列,其值为id为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

3 个答案:

答案 0 :(得分: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(*)

答案 1 :(得分:1)

您可以尝试下面的查询

--fail

您的评论

  

如果我还要更新Flag列呢?

请尝试此版本

#!/bin/bash
URIs=(
    https://pastebin.com/raw/w36QWU3D 
    https://pastebin.com/raw/NONEXISTENT
    https://pastebin.com/raw/M9znaBB2
     )

pids=(); for((i=0;i<3;i++)); do
    curl -fL "${URIs[$i]}" &>/dev/null &
    pids+=($!)

done
for pid in "${pids[@]}"; do
    wait $pid
    echo ret=$?
done

答案 2 :(得分:0)

我正在修改Gordon Query,因为这是您可以获得的最佳答案

查询1

 update t
        set status =

t.value&gt;&gt;删除“完成”

 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.Value &gt;&gt;删除“完成”

 From toupdate
        where status <> 'done' and cnt > 1;