【问题标题】:Query Two Tables from different Schema but Same Database从不同的模式但相同的数据库中查询两个表
【发布时间】:2016-09-21 19:16:45
【问题描述】:

首先,我在这里看到了一个类似的问题: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 执行此操作的。

【问题讨论】:

    标签: sql oracle oracle-sqldeveloper


    【解决方案1】:

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

    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;
    

    【讨论】:

      【解决方案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 不同 - 这是其中的大多数。

      【讨论】:

        【解决方案3】:

        假设您对相关架构所有者有正确的授权选择

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

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

        【讨论】:

          【解决方案4】:

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

          前一段时间,AskTom 上有一个关于最有效的方法的古老而长期的讨论。如果我记得,事实证明最有效的方法是UNION ALL 两个表(或者只是两个表中的 ID,如果这就是你所需要的),GROUP BY ID 并只保留那些HAVING COUNT(*) = 1。 (假设,即ID是两个表中的主键。)

          祝你好运!

          【讨论】:

            【解决方案5】:

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-01-15
              • 2014-08-15
              • 2010-12-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多