目前我正在执行多个MINUS和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?
答案 0 :(得分: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
子句查找要测试重复的值,因此这些值不包括键列。