Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server I';我已使用“搜索SQL Server问题”;“相交”;作为关键词,但没有任何帮助_Sql Server_Sql Server 2012_Intersect - Fatal编程技术网

Sql server I';我已使用“搜索SQL Server问题”;“相交”;作为关键词,但没有任何帮助

Sql server I';我已使用“搜索SQL Server问题”;“相交”;作为关键词,但没有任何帮助,sql-server,sql-server-2012,intersect,Sql Server,Sql Server 2012,Intersect,我有两个数据库中的两个表。一个在“主”数据库中,第二个在“存档”数据库中。结构相同,只是数据不同。问题是主表中的记录在存档表中重复。在将记录归档到归档表之前,我需要删除主表中的重复项。第一次尝试似乎效果很好,但活动日志被填满了,因为发生的事情太多而终止了整个过程。DBA告诉我以100000个为单位进行删除 我还发现,即使数据库之间的主键匹配,记录中也可能存在差异。这些记录需要保存,而不是作为副本删除。这就引出了INTERSECT和EXCEPT子句。我尝试了这三个示例,尽管每个INTERSECT都

我有两个数据库中的两个表。一个在“主”数据库中,第二个在“存档”数据库中。结构相同,只是数据不同。问题是主表中的记录在存档表中重复。在将记录归档到归档表之前,我需要删除主表中的重复项。第一次尝试似乎效果很好,但活动日志被填满了,因为发生的事情太多而终止了整个过程。DBA告诉我以100000个为单位进行删除

我还发现,即使数据库之间的主键匹配,记录中也可能存在差异。这些记录需要保存,而不是作为副本删除。这就引出了INTERSECT和EXCEPT子句。我尝试了这三个示例,尽管每个INTERSECT都返回100000条记录,但DELETE只删除94000到95000条记录。我为每个人都写了一些评论。最后一个删除主数据库表中的所有内容

-- Test #1: Doesn't delete 100,000 - around 94,000 or 95,000
DELETE TOP (100000) FROM [db_1].[table_1]
WHERE EXISTS    (
                    -- Returns 100,000
                    SELECT * FROM [db_1].[table_1]
                    INTERSECT
                    SELECT * FROM [db_2].[table_1]
                )

-- Test #2: Doesn't delete 100,000 - around 94,000 or 95,000
--          [test_data] returns 100,000 records
;WITH [test_data] AS    (
                            -- Returns 100,000
                            SELECT TOP (100000) * 
                            FROM    (
                                        SELECT * FROM [db_1].[table_1]
                                        INTERSECT
                                        SELECT * FROM [db_2].[table_1]
                                    ) [meh]
                        )
DELETE TOP (100000) FROM [db_1].[table_1]
WHERE EXISTS    (
                    SELECT * FROM [test_data]
                )

-- Test #3: Deletes everything from [db_1].[table_1]
--          The EXISTS clause returns 100,000
--          The DELETE statement deletes everything from [db_1].[table_1]
DELETE FROM [db_1].[table_1]
WHERE EXISTS    (
                    SELECT TOP (100000) [meh].[address_rid]
                        ,[meh].[REV] 
                    FROM    (
                                -- Returns 100,000
                                SELECT * FROM [db_1].[table_1]
                                INTERSECT
                                SELECT * FROM [db_2].[table_1]
                            ) [meh]
                )
这些信息够了吗,还是我应该补充更多?先谢谢你

*编辑* 废话!。好的,我很感谢你的反馈,我会尽量在我的解释中更加透彻。我需要删除两个数据库表之间重复的记录。由于需要检查每条记录,以确保它是真实的副本,在主数据库中没有数据更改,因此我找到了INTERSECT。据我所知,它会进行字段到字段的比较,验证数据库表之间的记录是否为真实副本。一旦建立,我想从主数据库中删除重复记录,将另一条记录保留在存档数据库中

Primary database:        Archive database:
table_1:                 table_1:
PK     f_1   f_2   f_3   PK   f_1   f_2   f_3
 1     A     B     B      1   A     B     B
 2     B     D     X      2   B     D     X
 3     C     G     Y     13   Q     M     O
 4     D     J     Z     14   S     M     K
在上表集合中,记录1和记录2是重复的。因为它们都存在于两个表中,所以我需要从主数据库表中删除它们。我遇到的是,根据我们的DBA,一些表有数百万条记录,需要在100000个记录块中删除它们。我的想法是,如果我将INTERSECT放在EXISTS子句中,将INTERSECT的结果限制为100000条记录,DELETE将删除100000条记录块。但事实并非如此。它可能会删除94000到95000条记录,然后当删除接近尾声时,它开始一次删除几条记录,逐渐减少为几条记录


如果我使用不正确,或者有更好的方法删除重复的记录,我会洗耳恭听。正如你们中的一些人所指出的,我很难正确地问问题,这就是为什么我不再问很多问题的原因。我非常感谢任何建议、意见和/或批评。我不会骄傲到拒绝任何帮助。除非是对我的狗的口头攻击。那我可能会生气!;-)我希望这有帮助。如果没有,我肯定会听到的。

问题是什么?这些大多是事实陈述,而不是最后一条。这个问题的答案是,是的,如果你需要其他问题的帮助,请添加更多。嗨,欢迎来到SO。我们这里肯定有一些信息,而不是一些疑问。这是一个很好的起点。仔细看,这里有一些主要的逻辑缺陷。EXISTS检查是否存在行。由于子查询不相关,如果子查询中有行,delete语句将删除它在表_1中找到的任何行。我认为您希望delete删除子查询中的行,而这不是您在这里编写的代码。没有订单的TOP是一个信号,表明你也有问题。你没有办法确保哪一行在没有订单的情况下返回。是的,我不明白你真正的问题是什么。你的主题行应该用一般术语简洁地描述这个问题,而不是描述你到目前为止为研究这个问题所做的工作。谢谢,肖恩。这是有道理的。在收到编辑反馈后,我将重新访问它。