2013-03-11 45 views
0

我在Oracle 10g中下表:如何比較表,找到重複的,也找到列有不同的價值

Table1 
Name Status 
a   closed 
b   live 
c   live 

Table2 
Name Status 
a   final 
b   live 
c   live 

有兩個表中沒有主鍵,我想寫一個查詢這將返回相同的行而不循環兩個表和比較行/列。如果狀態列不同,那麼Table2中的行將進行預選。

所以在上面的例子中我的查詢應該返回此:

Name Status 
a   final 
b   live 
c   live 

回答

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

像這樣的事情?

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

總是返回table2.Status你既覆蓋的情況下,當它們是相同的,當他們是不同的(本質上它並不重要的table1.Status值)。

相關問題