2016-09-21 108 views
2

首先,我看到一个类似的问题在这里问:Query two tables from different schema,但答案并不适用于我。从不同模式查询两个表,但数据库相同

我的情况:同一个表,不同的模式,相同的数据库(oracle的方式)。我试图找到一个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这样做。

回答

0

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

前段时间,AskTom对此进行了一次长期的讨论,讨论了最有效的方法。如果我记得,事实证明,最有效的方法是UNION ALL这两个表格(或者仅仅是来自两个表格的ID,如果这就是你需要的),GROUP BY ID并且只保留那些HAVING COUNT(*) = 1。 (假设,那ID是这两张表中的主键。)

祝你好运!

1

假设你有适当的补助对相关架构所有者

,如果你需要在同一个schema.table不在其他的你可以使用减去例如行选择:

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

很多方法可以让两个表,其中最简单的为负的区别

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

您的解决方案创建一个跨产品,其中S1中的每一行匹配到EV在S2中的第二行,其中s2.id与S1.ID不同 - 这是其中大部分。

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; 
0

会是这样的工作?左连接然后过滤到没有返回第二个表中的结果的结果。然后如有必要,您可以使用UNION返回相反的结果。

SELECT S1.ID 
FROM SCHEMA1.DATABASE_UPDATE S1 
LEFT JOIN SCHEMA2.DATABASE_UPDATE S2 
WHERE S2.ID IS NULL 
相关问题