从数据库

时间:2016-10-17 09:50:27

标签: sql postgresql

您好我有两个数据库,每个数据库都有相同的表。例如,我有一个名为world的表,它有4列:pkey1pkey2companyidcompany_name

我做了一个查询,搜索具有相同pkey1和pkey2的行,但是其中一个或多个其他属性在2个表中是不同的。我的问题是我怎么才能看到不同的属性?

这是我的查询它选择具有相同pkey1和pkey2的行如何升级它以查看两个数据库中存在差异的列,当然如果没有差异,查询的结果应该返回NULL在这一列中是我想要实现的一个例子:

在第一个数据库(1,1,345,' Ron'),第二个数据库(1,1,377,' Ron')中,结果应为(1,1,345,null)

2 个答案:

答案 0 :(得分:1)

基本上,为了引用不同数据库中的数据,您需要一个数据库链接,因为您使用的是PostgreSQL,这个文档应该有所帮助;

https://www.postgresql.org/docs/current/static/dblink.html

您需要使用此命令创建链接(在本例中为名称);

SELECT dblink_connect('CONNECTIONNAME', 'REMOTEDBCONNECTIONSTRING');

然后您可以通过选择查询使用此新连接;

SELECT * 
FROM dblink('CONNECTIONNAME','SELECT * FROM foo') AS t(a int, b text, c text[]);

并替换' foo'与你的世界'表名,然后将AS更改为与pkey1,pkey2,companyid,company_name等相关的变量。

答案 1 :(得分:1)

如果您的数据库已链接,您可以加入两个表,并使用“case”语句检查值是否已更改:

select a.pkey1, a.pkey2, 
case when a.companyid <> b.companyid then a.companyid else null end as companyid, 
case when a.company_name <> b.company_name then a.company_name else null end as company_name
from db1.dbo.world a
inner join db2.dbo.world b on a.pkey1 = b.pkey1 and a.pkey2 = b.pkey2

如果要省略没有差异的行,可以使用“except”:

select a.pkey1, a.pkey2, 
case when a.companyid <> b.companyid then a.companyid else null end as companyid, 
case when a.company_name <> b.company_name then a.company_name else null end as company_name
from (
    select pkey1, pkey2, companyid, company_name 
    from db1.dbo.world
    except 
    select pkey1, pkey2, companyid, company_name 
    from db2.dbo.world) a
inner join db2.dbo.world b on a.pkey1 = b.pkey1 and a.pkey2 = b.pkey2