SQL:两个数据库,都有包含公共值列的表。如何查找丢失的行

Posted

技术标签:

【中文标题】SQL:两个数据库,都有包含公共值列的表。如何查找丢失的行【英文标题】:SQL: Two databases, both has table with column of common values. How to find missing rows 【发布时间】:2016-07-12 06:45:12 【问题描述】:

我有两个数据库,两个数据库都有一个包含一列公共值的表。我想要实现的是获取所有记录,其中database1 table1(具有共同值)记录在database2 table2(具有共同值)中没有对应项。 获取这些记录的最佳方法是什么?是否有任何资源轻量级的方法可以做到这一点,而不影响数据库性能?

例如:

Database1
Table1 - id/number(common value)/object/name

Database2
Table1 - table_id/number(common value)/table_object/table_name

假设 database1 table1 列“number”具有值:1,2,3,database2 table1 列“number”具有值 1,2,3,4,5 现在我需要找到这两条记录,database1中缺少什么,但database2中存在什么(在本例中,我正在查找database2中“number”值为4和5的记录)

【问题讨论】:

试试这个...select * from db1.table1 where id not in (select id from db2.table2); 您使用的是哪个 DBMS? SQL 只是一种查询语言而不是 DBMS 产品。 有一些工具可以做到这一点:购买,不要构建,例如Redgate SQL Data Compare. 在 SQL Server 中我会使用 EXCEPT 【参考方案1】:

要访问不同数据库的对象(表、过程),您需要建立一种机制,通过该机制可以访问不同数据库的对象。

您可以为此查看这些资源 Cross Database Access in SQL Server 或 Linked Server。

一旦您能够在查询中访问这两个数据库,那么您的查询就会像这样非常简单

SELECT database2.table1.number FROM database2.table1 
WHERE database2.table1.number NOT EXISTS (SELECT database1.table1.number FROM database1.table1)

【讨论】:

这无法正确处理 NULL。如果 database1.table1 中有 NULL,则此查询将返回 0 条记录。对相关子查询使用 NOT EXISTS 或正确处理 NULL。【参考方案2】:

您可以通过三种方式获取这些缺失的记录: * 请注意,如果您想查找 database2 中的缺失值并与 database1 进行比较,它将对您有所帮助,如果表的 Id 也很常见,最好加入 id 而不是 number。

select * 
from database2.dbo.table1 As D2 
left join database1.dbo.table1 As D1 on D1.number = D2.number
where D1.Number is null


select * 
from database2.dbo.table1  
where number not in (
select number  from database1.dbo.table1 ) 

select * 
from database2.dbo.table1 As  D2
where number  NOT EXISTS  (
select number  from database1.dbo.table1 As D1 where D1.number = D2.number   ) 

【讨论】:

您的 NOT IN 查询与 Sachin 的查询存在相同的问题。如果 database1 中有 number = NULL 的记录,它将返回零记录。要么添加 where 条件,要么确保该数字不可为空。 谢谢大家的回复!出现了一些额外的问题。如果数据库在同一台服务器上,上述查询似乎可以流畅地工作。但如果数据库位于链接的不同服务器上,则不会那么流畅。还有整理问题,我不得不使用整理子句,它会影响性能吗?有没有其他资源简单的方法来比较这些表? 没错,我假设数字不可为空,但如果我们的数字为空,我们可以这样编写查询:' select * from database2.dbo.table1 where number is not null and number not in (从 database1.dbo.table1 中选择数字,其中数字不为空)' 所以使用排序规则会影响你的表现,但如果你的数据不是太多,也许它不会影响,但如果你看到它让你的查询变慢,你可以使用解决方案,我在***上读到了类似的问题。

以上是关于SQL:两个数据库,都有包含公共值列的表。如何查找丢失的行的主要内容,如果未能解决你的问题,请参考以下文章

具有多个值列的数据透视表

如何查找两个数组是不是包含 SQL 中的任何公共项?一个数组是我的设置结果,另一个是“ids”列表?

在 SQL 中,如何为另一列的每个不同值创建新的值列?

如何从 SqlDataReader 获取列的表名

IN SQL INNER JOIN 可以添加两个不同列的表吗?

如何在 SQL 中加入包含祖父-父-子列的表?