SQL查询仅在所有列值匹配时才更新表

时间:2018-12-28 08:55:27

标签: sql sql-server

我正在处理查询和表,并且有一个看起来像这样的表。

Name   |      Job     | Status
===============================
Test1  |  Completed   | Pending
Test1  |  50%         | Pending
Test2  |  Completed   | Pending
Test2  |  Completed   | Pending
Test2  |  Completed   | Pending

我可以使用一个查询来查看名称和作业列,并且如果所有匹配名称的作业列都为“完成”,则将状态列更新为“已完成”吗?

为澄清起见,在上面的示例中,所有“ Test2”作业都被标记为已完成,因此我希望状态也表示已完成-但前提是所有Test2作业均已完成。

5 个答案:

答案 0 :(得分:4)

这是SQL Server的一种可能的解决方案:

method

答案 1 :(得分:1)

另一个选择;

UPDATE Table1 SET Status = 'Completed' WHERE Name IN (
  SELECT Name 
  FROM Table1
  GROUP BY Name
  HAVING COUNT(*) = SUM(CASE WHEN Job='Completed' THEN 1 ELSE 0 END)
)

内部选择查找所有Job值均设置为Completed的名称,而更新仅更新具有找到的名称的行的状态。

A DBfiddle for testing

答案 2 :(得分:0)

尝试一下

UPDATE Table_Name SET Status = 'Completed' WHERE Name = 'Completed' AND Job = 'Completed'

答案 3 :(得分:0)

请尝试。

UPDATE yourTable  
SET Status = 'Completed'
WHERE
    Job = 'Completed' AND
     Name not in (select Name from yourTable where Job<>'Completed')

答案 4 :(得分:0)

您可以尝试以下

create table #temp (Name varchar(20), Job varchar(20), sStatus varchar(20))

insert into #temp values 
('Test1'  ,  'Completed'   , 'Pending'),
('Test1'  ,  '50%'         , 'Pending'),
('Test2'  ,  'Completed'   , 'Pending'),
('Test2'  ,  'Completed'   , 'Pending'),
('Test2'  ,  'Completed'   , 'Pending')

update #temp set sStatus = 'Completed'
where Name not in (
    select a.Name from #temp a
    where a.Job <> 'Completed'
)

select * from #temp