从两个表中获取差异并在SQL Server中删除
我在编写一个查询逻辑时面临一个问题,该查询删除两个表中都不存在的数据 例如,我有一个表Stage和Parent。我使用复合主键来唯一标识记录多个主键 阶段结构和数据从两个表中获取差异并在SQL Server中删除,sql,sql-server,Sql,Sql Server,我在编写一个查询逻辑时面临一个问题,该查询删除两个表中都不存在的数据 例如,我有一个表Stage和Parent。我使用复合主键来唯一标识记录多个主键 阶段结构和数据 S_Column1(Primary) | PRIDATA1 | PRIDATA4 S_Column2(Primary) | PRIDATA2 | PRIDATA5 S_Column3(Primary) | PRIDATA3 | PRIDATA6 S_Column4 | DJUC | JDNC S_Colum
S_Column1(Primary) | PRIDATA1 | PRIDATA4
S_Column2(Primary) | PRIDATA2 | PRIDATA5
S_Column3(Primary) | PRIDATA3 | PRIDATA6
S_Column4 | DJUC | JDNC
S_Column5 | DSSDC | JDDOS
P_Column1(Primary) | PRIDATA1 | PRIDATA4 | PRIDATA7
P_Column2(Primary) | PRIDATA2 | PRIDATA5 | PRIDATA8
P_Column3(Primary) | PRIDATA3 | PRIDATA6 | PRIDATA9
P_Column4 | DJUC | JDNC | FFED
P_Column5 | DSSDC | JDDOS | NHUY
父结构和数据
S_Column1(Primary) | PRIDATA1 | PRIDATA4
S_Column2(Primary) | PRIDATA2 | PRIDATA5
S_Column3(Primary) | PRIDATA3 | PRIDATA6
S_Column4 | DJUC | JDNC
S_Column5 | DSSDC | JDDOS
P_Column1(Primary) | PRIDATA1 | PRIDATA4 | PRIDATA7
P_Column2(Primary) | PRIDATA2 | PRIDATA5 | PRIDATA8
P_Column3(Primary) | PRIDATA3 | PRIDATA6 | PRIDATA9
P_Column4 | DJUC | JDNC | FFED
P_Column5 | DSSDC | JDDOS | NHUY
以上只是两个表的结构和数据示例。
所以基本上我想做的是写一个查询来删除
PRIDATA7 PRIDATA8和PRIDATA9作为主键,因为它们的条目不在阶段表中
我并不熟练,但我知道我需要使用JOIN查找匹配的数据,并从父表中删除其条目不在阶段表中的其余数据
PS:我将在触发器中使用它。您可能正在查找EXCEPT运算符。
阅读此处:您可能正在寻找EXCEPT运算符。 阅读此处:尝试不存在
delete from parent
where not exists (
select 1
from stage s
where s.S_Column1 = parent.S_Column1 and s.S_Column2 = parent.S_Column2 and s.S_Column3 = parent.S_Column3)
尝试不存在
delete from parent
where not exists (
select 1
from stage s
where s.S_Column1 = parent.S_Column1 and s.S_Column2 = parent.S_Column2 and s.S_Column3 = parent.S_Column3)
是的,我想到了,但我只能选择和显示它。如何使用EXCEPT删除这些数据?您可以创建一个临时表,其中包含要删除的数据,然后使用where子句从父表中删除。例如,在“从某物中选择某物”中的where列是的,我想到了,但我只能选择并显示它。如何使用EXCEPT删除这些数据?您可以创建一个临时表,其中包含要删除的数据,然后使用where子句从父表中删除,例如,在where列中,从有效的SomethingTanks中选择某些内容!你能解释一下吗,这是什么“1”?选择1?Exists不返回任何数据,仅返回布尔值true/false。所以Select中的任何数据都可以。选择1只会节省一些不必要的工作。谢谢你的帮助!你能解释一下吗,这是什么“1”?选择1?Exists不返回任何数据,仅返回布尔值true/false。所以Select中的任何数据都可以。选择1只会节省一些不必要的工作。