我们有一个SQL脚本经常运行,以删除我们数据库中的孤立记录。
Delete From [factFooDetail]
Where [FooHeaderID] Not In (Select [FooHeaderID] From [factFooHeader])
由于某种原因,无论如何都会删除标题表中包含标题ID的一堆记录!
我们正在运行SQL Server 2005
是否有任何罕见的错误/边缘情况,这将无法按预期工作?
答案 0 :(得分:0)
查询似乎没问题。但是,在没有看到真实查询的情况下很难判断,因为它可能有其他子句(where
,group 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
。