2014-05-14 82 views
2

目前我perforing多個MINUS和UNION ALL操作,但在那之後,我想,以確定從哪個源錶行給出結果行來。例如:UNION ALL和減結果行源識別

SELECT * FROM 
    (SELECT 1 AS SRC, tab_1.* FROM tab_1 
    MINUS 
    SELECT 1 AS SRC, tab_2.* FROM tab_2) 
    UNION ALL 
    (SELECT 2 AS SRC, tab_2.* FROM tab_2 
    MINUS 
    SELECT 2 AS SRC, tab_1.* FROM tab_1) 

現在我有上面的表格之一存在的行,並想知道我正在查看哪一行。從tab_1中和tab_2被除去,因爲它們使所述比較不可能的(它們是從不同的序列生成的)表中的任何鍵,也沒有業務鍵存在。在這種情況下,我需要有像其他人爲重點,甚至ROWID,但如何使用ROWID在上面的查詢?

回答

5

你似乎想要的東西,只在一個表中,但不能同時使用。它需要多一點的比較工作,但你可以用not exists

select 1 as src, t1.* 
from tab_1 t1 
where not exists (select 1 from tab_2 t2 where t2.col1 = t1.col1 and . . .) 
union all 
select 2 as src, t2.* 
from tab_2 t2 
where not exists (select 1 from tab_1 t1 where t1.col1 = t2.col1 and . . .); 

在這種情況下,*確實意味着所有列,包括關鍵列。該版本假定兩個表具有相同順序的相同列;在實踐中,你通常需要一個明確的列列表。

where條款查找您所要測試的重複的值,因此這將不包括關鍵列。