首先,我在这里看到了一个类似的问题: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做的。
答案 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