查询来自不同Schema但相同数据库的两个表

时间:2016-09-21 19:16:45

标签: sql oracle oracle-sqldeveloper

首先,我在这里看到了一个类似的问题:Query two tables from different schema,但答案对我不起作用。

我的情况:同一个表,不同的模式,相同的数据库(顺便说一下oracle)。我试图在一个schema.table中找到不在另一个schema.table中的所有行。我有以下查询:

select S1.ID
FROM SCHEMA1.DATABASE_UPDATE S1, 
SCHEMA2.DATABASE_UPDATE S2
WHERE
S1.ID != S2.ID

我收到数以千计的重复参赛作品。显然,这是错误的。 S1中有448行,S2中有439行。应该只有9个唯一的行。我究竟做错了什么?谢谢!

顺便说一下,我是从sqlDeveloper做的。

5 个答案:

答案 0 :(得分:3)

减号是一个很好的解决方案,但我建议在不同方面做。

select S1.ID
FROM SCHEMA1.DATABASE_UPDATE S1
minus
select S2.ID
SCHEMA2.DATABASE_UPDATE S2

select S2.ID
SCHEMA2.DATABASE_UPDATE S2    
minus
select S1.ID
FROM SCHEMA1.DATABASE_UPDATE S1

另一种方法(在一个查询中):

select S1.ID,S2.ID
FROM SCHEMA1.DATABASE_UPDATE S1
FULL OUTER JOIN SCHEMA2.DATABASE_UPDATE S2 ON (S1.ID = S2.ID)
WHERES S1.ID IS NULL OR S2.ID IS NULL;

答案 1 :(得分:2)

获得两个表之间区别的很多方法,其中最简单的就是MINUS

select S1.ID FROM SCHEMA1.DATABASE_UPDATE S1, 
MINUS
select S2.ID FROM SCHEMA2.DATABASE_UPDATE S2

您的解决方案会创建一个交叉产品,其中S1中的每一行都与S2中的每一行匹配,其中s2.id与S1.ID不同 - 这是大多数行。

答案 2 :(得分:1)

假设您在相关架构所有者上有适当的授权选择

如果你需要一个不在另一个schema.table中的所有行,你可以使用减号,例如:

select S1.ID
FROM SCHEMA1.DATABASE_UPDATE S1
minus
select S2.ID
SCHEMA2.DATABASE_UPDATE S2

答案 3 :(得分:0)

您将从两个模式中获取所有行对,其中第一个中的ID与第二个中的ID不同。事实上,你想要的是一个表中的ID不在第二个ID中。这是一个不同的问题。

在AskTom上讨论过一段时间以前最有效的方法。如果我记得,事实证明,最有效的方法是UNION ALL两个表(或者只是两个表中的ID,如果这就是你需要的全部内容),GROUP BY ID并保留那些HAVING COUNT(*) = 1 {1}}。 (假设,即ID是两个表中的主键。)

祝你好运!

答案 4 :(得分:0)

这样的事情会起作用吗?然后左连接过滤到未在第二个表中返回结果的结果。然后,如果有必要,您也可以使用UNION返回相反的结果。

SELECT S1.ID 
FROM SCHEMA1.DATABASE_UPDATE S1
LEFT JOIN SCHEMA2.DATABASE_UPDATE S2
WHERE S2.ID IS NULL