基于符合条件的1条记录更新多条记录

问题描述 投票:0回答:4

我正在尝试从其中1个记录符合条件的数据集中选择所有记录。我有一张数据表,其中包含一个人每天的工作时间。如果该周内的某条记录的“已记录”标志设置为“ N”,则我需要选择该人该周的所有记录。这是一个数据示例:

t_hours:

Name  Week  Weekday  Hours  Logged
===============================
Jim   1     Mon      8       Y
Jim   1     Wed      8       Y
Jim   1     Fri      8       Y
Jim   2     Mon      8       Y
Jim   2     Wed      8       Y
Bill  1     Mon      8       N
Bill  1     Tue      8       Y
Bill  1     Wed      8       Y
Bill  1     Thu      8       Y
Bill  2     Mon      8       Y
Bill  2     Tue      8       Y

我想编写一个查询,将某人工作周的所有记录更新为Logged ='N',如果他们有一天的Logged ='N'。但是我不知道该如何选择记录。这是我要更新的记录:

Name  Week  Weekday  Hours  Logged
===============================
Bill  1     Mon      8       N
Bill  1     Tue      8       Y
Bill  1     Wed      8       Y
Bill  1     Thu      8       Y

我尝试了普通选择,但无法弄清楚在where子句中如何具有两个相关的子查询:

SELECT * FROM t_hours
WHERE (Name = (SELECT t1.Name FROM t_hours t1 
               where t1.Name = t2.Name and t1.Week = t2.Week and 
               t1.Logged = 'N') and
       Week = (SELECT t2.Week FROM t_hours t2 
               where t1.Name = t2.Name and t1.Week = t2.Week and 
               t2.Logged = 'N')

但是这不起作用,非常感谢您的帮助。

sql sql-server where-clause correlated-subquery
4个回答
0
投票

返回数据:

 SELECT *
FROM   t_hours t1
WHERE  EXISTS (SELECT 1
               FROM   t_hours t2
               WHERE  t1.NAME = t2.NAME
                      AND t1.week = t2.week
                      AND t2.logged = 'N');  

更新数据:

 UPDATE t_hours
SET    logged = 'N'
WHERE  EXISTS (SELECT 1
               FROM   t_hours t2
               WHERE  t1.NAME = t2.NAME
                      AND t1.week = t2.week
                      AND t2.logged = 'N');  

如果数据集足够大,则可以按名称,星期和记录的类型进行分组。


0
投票

尝试以下使用存在

select t1.* from table_name t1
where exists( select 1 from table_name t2 where t1.week=t2.week
                                          and t2.logged='N' and t1.name=t2.name
             )

0
投票

您可以使用可更新的CTE:

with toupdate as (
      select t.*,
             min(logged) over (partition by name, week) as min_logged
      from t
     )
update toupdate
    set logged = min_logged
    where min_logged = 'N' and min_logged <> logged;

min(logged)表达式将返回人/周的任何'N'值是logged(其余则是'N')。


0
投票

这是您想要的吗?

'Y'
© www.soinside.com 2019 - 2024. All rights reserved.