Sql 通过检查不同表中另一列的值来更新列的步骤

Sql 通过检查不同表中另一列的值来更新列的步骤,sql,sql-server,Sql,Sql Server,我正在尝试根据另一个公用表中的标志更新主表中的标志。两者都与外键关系相关。但问题是另一个公共表中的标志是0或1。因此,仅当特定FK的所有值为1时,它才应将主表中的标志更新为1 假设下面列出了两个表。XYZ和ABC。两者通过外键相互关联。 XYZ: ABC: 如果您在ABC表中看到XYZID,则两者的显示值均为1。我希望在XYZID 1的XYZ主表的Posted as 1中更新该值。但如果您查看ABC表中IsPosted的XYZID值3,则它是0和1。因此,对于XYZID值3,XYZ表中的过账值不

我正在尝试根据另一个公用表中的标志更新主表中的标志。两者都与外键关系相关。但问题是另一个公共表中的标志是0或1。因此,仅当特定FK的所有值为1时,它才应将主表中的标志更新为1

假设下面列出了两个表。XYZ和ABC。两者通过外键相互关联。 XYZ:

ABC:

如果您在ABC表中看到XYZID,则两者的显示值均为1。我希望在XYZID 1的XYZ主表的Posted as 1中更新该值。但如果您查看ABC表中IsPosted的XYZID值3,则它是0和1。因此,对于XYZID值3,XYZ表中的过账值不应更新为1。通常,如果所有外键值的IsPosted为1,那么在XYZ表的Posted列中,只应将其更新为1。如果为0或1,则不应在XYZ表中更新

我想用GROUPBY或cursor。但我不知道该怎么开始


如果有人能在这方面帮助我,那将是很有帮助的。这很简单,但我不想从这开始。任何帮助都将不胜感激。

通过加入一个子查询来更新表,该子查询按xyzid对表进行分组
abc
,并在
having
子句中设置条件:

update t
set posted = 1  
from xyz t inner join (
  select xyzid from abc
  group by xyzid
  having sum(case when isposted = 0 then 1 else 0 end) = 0
) a on a.xyzid = t.xyzid
having条款中的条件也可以写成:

having sum(abs(isposted - 1)) = 0
请参阅。
结果:


通过加入一个子查询来更新表,该子查询按xyzid对表
abc
进行分组,并在
having
子句中设置条件:

update t
set posted = 1  
from xyz t inner join (
  select xyzid from abc
  group by xyzid
  having sum(case when isposted = 0 then 1 else 0 end) = 0
) a on a.xyzid = t.xyzid
having条款中的条件也可以写成:

having sum(abs(isposted - 1)) = 0
请参阅。
结果:

请尝试以下操作:

UPDATE [a]
SET    a.[Posted] = [b].[IsPosted]
FROM   [a]
       INNER JOIN (SELECT [xyzid],
                          [IsPosted] = MIN(Cast([IsPosted] AS INT))
                   FROM
                     [b]
                   GROUP  BY
                    [xyzid]
                   HAVING
                    MIN(Cast([IsPosted] AS INT)) = 1) [b]
               ON [a].[xyzid] = [b].[xyzid] 
本质上,内部查询只返回表B中所有1值的条目,然后基于FK联接更新A表

可能会有更高效的查询,这将重新更新以前更新的A.已发布的值,如果表B中的任何内容标记为IsPosted=0,则不会取消更新A.已发布。

请尝试以下操作:

UPDATE [a]
SET    a.[Posted] = [b].[IsPosted]
FROM   [a]
       INNER JOIN (SELECT [xyzid],
                          [IsPosted] = MIN(Cast([IsPosted] AS INT))
                   FROM
                     [b]
                   GROUP  BY
                    [xyzid]
                   HAVING
                    MIN(Cast([IsPosted] AS INT)) = 1) [b]
               ON [a].[xyzid] = [b].[xyzid] 
本质上,内部查询只返回表B中所有1值的条目,然后基于FK联接更新A表


可能会有更高效的查询,这将重新更新以前更新的A.已发布的值,如果表B中的任何内容标记为IsPosted=0,则不会取消更新A.已发布。

假设只有
0
1
,一种方法是使用相关子查询获取
xyzid
的最小
isposted

UPDATE main_table
       SET posted = (SELECT min(another_common_table.isposted)
                            FROM another_common_table
                            WHERE another_common_table.xyzid = main_table.xyzid);

如果存在
0
,则最小值为
0
。如果只有
1
s,那么它将是
1

假设只有
0
1
,一种方法是使用相关子查询获取
xyzid
的最小
isposted

UPDATE main_table
       SET posted = (SELECT min(another_common_table.isposted)
                            FROM another_common_table
                            WHERE another_common_table.xyzid = main_table.xyzid);

如果存在
0
,则最小值为
0
。如果只有
1
s,那么它将是
1

如果IsPosted是一个bit,那么您必须将其转换为int,因为您不能在bit数据类型上使用聚合函数。我同意您必须将其转换为int,因为我使用的是bit数据类型。但是谢谢你的帮助。非常感谢。如果IsPosted是一个bit,您必须将其转换为int,因为您不能在bit数据类型上使用聚合函数。我同意您必须将其转换为int,因为我使用的是bit数据类型。但是谢谢你的帮助。非常感谢。