如何比较表并查找重复项,还可以找到具有不同值的列

时间:2013-03-11 14:00:46

标签: sql plsql oracle10g

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

Table1
Name  Status
a         closed
b         live
c         live

Table2
Name  Status
a         final
b         live
c         live

两个表中都没有主键,我正在尝试编写一个返回相同行的查询,而不会循环两个表并比较行/列。如果状态列不同,那么表2中的行将占用优先级。

所以在上面的例子中我的查询应该返回:

Name   Status
a         final
b         live
c         live

2 个答案:

答案 0 :(得分:3)

由于您已经提到两个表上都没有主键,我假设Table1可能存在行,Table2 , 或两者。以下查询使用Common Table ExpressionWindowing function来获得此类结果。

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 :(得分:1)

这样的东西?

SELECT table1.Name, table2.Status
FROM table1
INNER JOIN table2 ON table1.Name = table2.Name

通过始终返回table2.Status,您已经涵盖了它们相同且不同时的情况(基本上与table1.Status的值无关)。< / p>