SQL Server:为什么此删除查询不起作用?
我有两个表SQL Server:为什么此删除查询不起作用?,sql,sql-server-2008-r2,Sql,Sql Server 2008 R2,我有两个表FinalList和RemoveTheseIDsList。它们都有相同的主键ID。我想从FinalList中删除RemoveTheseIDsList中的所有行。所以,我写了第一个查询: Delete from FinalList Where FinalList.ID not in (Select ID from RemoveTheseIDsList) 理论上,该查询应该删除FinalList中的每一行。相反,它删除了0。我最终决定采用这种笨重的解决方法(确实有效): 我的问题
FinalList
和RemoveTheseIDsList
。它们都有相同的主键ID
。我想从FinalList
中删除RemoveTheseIDsList
中的所有行。所以,我写了第一个查询:
Delete from FinalList
Where FinalList.ID not in (Select ID from RemoveTheseIDsList)
理论上,该查询应该删除FinalList
中的每一行。相反,它删除了0。我最终决定采用这种笨重的解决方法(确实有效):
我的问题是:为什么第一个查询不起作用?是否有一种快速修复方法可以使此查询保持功能性和小型化?正如您所说:“我想从FinalList中删除位于RemoveTheseIDsList中的所有记录”
因此,它应该是:
Delete from FinalList
Where FinalList.ID IN (Select ID from RemoveTheseIDsList)
但您的更新就像一个不在,所以请尝试以下方法:
Delete from FinalList
Where FinalList.ID NOT IN (Select RemoveTheseIDsList.ID from RemoveTheseIDsList)
正如您所说:“我想从FinalList中删除RemoveTheseIDsList中的所有记录”
因此,它应该是:
Delete from FinalList
Where FinalList.ID IN (Select ID from RemoveTheseIDsList)
但您的更新就像一个不在,所以请尝试以下方法:
Delete from FinalList
Where FinalList.ID NOT IN (Select RemoveTheseIDsList.ID from RemoveTheseIDsList)
您是否确定
ID
实际上是RemoveTheseIDsList
的主键?我怀疑它是可空的,并且至少包含一个NULL
——或者RemoveTheseIDsList
根本不包含名为ID
的列,并且子查询引用了外部查询中的ID
列。您遇到了什么错误?第一个查询不应该读取ID IN()
,而不是ID not IN()
?@MichaelHaren-左侧外部连接查询正在进行一个反半连接,尽管有描述,但我猜想他们确实希望不在语义中。您是否肯定ID
实际上是删除seidslist
的主键?我怀疑它是可空的,并且至少包含一个NULL
——或者RemoveTheseIDsList
根本不包含名为ID
的列,并且子查询引用了外部查询中的ID
列。您遇到了什么错误?第一个查询不应该在()
中读取ID,而不是ID不在()
?@MichaelHaren-左侧外部连接查询正在进行反半连接,尽管有描述,但我猜想他们确实希望不在语义中。可以重写为连接,取决于您喜欢的从FinalList fl内部连接DELETE fl RemoveTheseIDsList rtl ON fl.ID=rtl.ID
我会在子查询NOT in
中添加一个,RemoveTheseIDsList.ID不为空,以确保这是我的主要怀疑。如果他在FinalList中得到空值,如果他进行更新,我认为left join将为null,这就是它删除RemoveTheseIDsList表中所有记录的原因。所以我的答案中的第一个删除应该是正确的。@GregM-不,在RemoveTheseIDsList.ID
中出现NULL
不会影响左连接,但是(x,y,NULL)
中不出现的任何都不会返回任何结果。是的,但我说的是finallist中出现NULL将被重写为连接,取决于您喜欢的从FinalList fl内部连接DELETE fl RemoveTheseIDsList rtl ON fl.ID=rtl.ID
我会在子查询NOT in
中添加一个,RemoveTheseIDsList.ID不为空,以确保这是我的主要怀疑。如果他在FinalList中得到空值,如果他进行更新,我认为left join将为null,这就是它删除RemoveTheseIDsList表中所有记录的原因。所以我的答案中的第一个删除应该是正确的。@GregM-不,在RemoveTheseIDsList.ID
中出现NULL
不会影响左连接,但是(x,y,NULL)
中没有的任何都不会返回任何结果。是的,但我说的是在FinalList中出现NULL