Sql 通过检查不同表中另一列的值来更新列的步骤
我正在尝试根据另一个公用表中的标志更新主表中的标志。两者都与外键关系相关。但问题是另一个公共表中的标志是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。但我不知道该怎么开始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表中的过账值不
如果有人能在这方面帮助我,那将是很有帮助的。这很简单,但我不想从这开始。任何帮助都将不胜感激。通过加入一个子查询来更新表,该子查询按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数据类型。但是谢谢你的帮助。非常感谢。