这个查询应该不计后地删除行的任何原因?

时间:2012-02-21 08:48:15

标签: sql sql-server sql-server-2005

我们有一个SQL脚本经常运行,以删除我们数据库中的孤立记录。

Delete From [factFooDetail]
Where [FooHeaderID] Not In (Select [FooHeaderID] From [factFooHeader])

由于某种原因,无论如何都会删除标题表中包含标题ID的一堆记录!

我们正在运行SQL Server 2005

是否有任何罕见的错误/边缘情况,这将无法按预期工作?

3 个答案:

答案 0 :(得分:0)

查询似乎没问题。但是,在没有看到真实查询的情况下很难判断,因为它可能有其他子句(wheregroup by等),这些子句可能会影响子查询返回的结果,从而影响已删除的行。 / p>

例如,如果从子查询中仅过滤1条记录,并且在详细信息中有与其对应的记录,则将删除已过滤的标题记录的所有详细信息行。

考虑到这一点并确保您没有过滤其他行。

答案 1 :(得分:0)

在运行此语句后,您是否确实直接删除了行?

尝试使用在生产中调用的确切参数/值来复制问题。

不排除有人手动删除数据的可能性,或者某些其他代码删除了该行。

答案 2 :(得分:0)

  

是否有任何罕见的错误/边缘情况,这将无法按预期工作?

这取决于ANSI_NULLS的值,但最好我能说明这只会导致它删除您期望的数据或更少。

SET ANSI_NULLS ON;

CREATE TABLE #factFooHeader
(
  FooHeaderID INT
);

CREATE TABLE #factFooDetail
(
  FooHeaderID INT
);

INSERT INTO #factFooDetail
VALUES (1), (2);

INSERT INTO #factFooHeader
VALUES (1), (NULL);

DELETE FROM #factFooDetail
WHERE FooHeaderID NOT IN (
    SELECT FooHeaderID FROM #factFooHeader
);

DROP TABLE #factFooDetail;

DROP TABLE #factFooHeader;

产生以下结果:

(2 row(s) affected)

(2 row(s) affected)

(0 row(s) affected)

但是,ANSI_NULLS设置为OFF

(2 row(s) affected)

(2 row(s) affected)

(1 row(s) affected)

如果您的WHERE子句中有多个谓词,则行为可能会更加混乱,因为Three-Valued-Logic Truth Table不再成立,ANSI_NULLS设置为OFF