Sql 如何比较表、查找重复项以及查找具有不同值的列

Sql 如何比较表、查找重复项以及查找具有不同值的列,sql,plsql,oracle10g,Sql,Plsql,Oracle10g,我在Oracle 10g中有以下表格: Table1 Name Status a closed b live c live Table2 Name Status a final b live c live 两个表中都没有主键,我正在尝试编写一个查询,该查询将返回相同的行,而不会循环两个表并比较行/列。如果status列不同,则表2中的行将显示 因此,在上面的示例中,我的查询应返回以下内容: N

我在Oracle 10g中有以下表格:

Table1
Name  Status
a         closed
b         live
c         live

Table2
Name  Status
a         final
b         live
c         live
两个表中都没有主键,我正在尝试编写一个查询,该查询将返回相同的行,而不会循环两个表并比较行/列。如果status列不同,则表2中的行将显示

因此,在上面的示例中,我的查询应返回以下内容:

Name   Status
a         final
b         live
c         live

既然您提到两个表上都没有主键,我假设可能有一行存在于
Table1
Table2
,或者两者都存在。下面的查询使用
公共表表达式
窗口函数
得到这样的结果

WITH unionTable
AS
(
    SELECT  Name, Status, 1 AS ordr FROM Table1
    UNION 
    SELECT  Name, Status, 2 AS ordr FROM Table2
),
ranks 
AS
(
    SELECT  Name, Status,
            ROW_NUMBER() OVER (PARTITION BY NAME ORDER BY ordr DESC) rn
    FROM    unionTable
)
SELECT  Name, Status
FROM    ranks
WHERE   rn = 1

    • 既然您提到两个表上都没有主键,我假设可能有一行存在于
      表1
      表2
      ,或者两者都存在。下面的查询使用
      公共表表达式
      窗口函数
      得到这样的结果

      WITH unionTable
      AS
      (
          SELECT  Name, Status, 1 AS ordr FROM Table1
          UNION 
          SELECT  Name, Status, 2 AS ordr FROM Table2
      ),
      ranks 
      AS
      (
          SELECT  Name, Status,
                  ROW_NUMBER() OVER (PARTITION BY NAME ORDER BY ordr DESC) rn
          FROM    unionTable
      )
      SELECT  Name, Status
      FROM    ranks
      WHERE   rn = 1
      
        • 像这样的东西

          SELECT table1.Name, table2.Status
          FROM table1
          INNER JOIN table2 ON table1.Name = table2.Name
          
          通过始终返回
          table2.Status
          ,您已经涵盖了相同和不同的情况(本质上,表1.Status的值是什么并不重要)。

          类似的情况

          SELECT table1.Name, table2.Status
          FROM table1
          INNER JOIN table2 ON table1.Name = table2.Name
          
          通过始终返回
          table2.Status
          ,您已经涵盖了它们相同和不同的情况(本质上,表1.Status的值是什么并不重要)