我在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
如您所见,start
和end
与row 1 and 4
和row 2 and 5
相同。
但值row with id 1 is 102, and that of 4 is pending
,
我想编写一个查询,查找同一个start
和end
的另一个问题,然后将列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
答案 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;