与Oracle中的INTERSECT相反

w6mmgewl  于 2023-06-22  发布在  Oracle
关注(0)|答案(7)|浏览(154)

我有两个选择,我想以这样的方式合并它们,即只返回两个选择中唯一的行。Oracle 10g中有没有内置的方法来实现这一点?
我知道我可以这样做:

(select1 UNION select2)
MINUS
(select1 INTERSECT select2)

但我想避免select1select2都有20行,所以这种方式非常模糊,难以维护。

ztigrdn8

ztigrdn81#

如果select1select2都没有返回重复项,则可以使用以下命令:

SELECT * FROM (select1 UNION ALL select2) a
GROUP BY a.col1, a.col2, ...
HAVING count(*) = 1
bgtovc5b

bgtovc5b2#

在Oracle 10 g中,您可以随意使用公共表表达式。

WITH
  select_1 AS (
    SELECT *
    FROM your_table
    WHERE your_condition = 1
  ),
  select_2 AS (
    SELECT *
    FROM your_other_table
    WHERE your_other_condition = 1
  )
SELECT * FROM select_1
UNION
SELECT * FROM select_2
MINUS
(
  SELECT * FROM select_1
  INTERSECT
  SELECT * FROM select_2
);

这样可以使子查询保持可维护性,并使最终查询的目的清晰明了。
当然,让Oracle在SQL中添加一个SYM_DIFFERENCE运算符会更好,但我并没有屏住呼吸--他们仍然不相信BOOLEAN数据类型是一个好主意。

mklgxw1f

mklgxw1f3#

还有一个想法:

  • 执行select1和select2的完全外联接
  • 仅使用select1.id = NULL(记录仅在select2中)或select2.ID = NULL(记录仅在select1中)的记录

就像这样:

SELECT *
FROM select1 FULL OUTER JOIN select2 on select1.id = select2.id
WHERE select1.id is null or select2.id is null
m2xkgtsf

m2xkgtsf4#

这对我很有效-不确定它有多快。

(select table_name from dba_tables where user = 'X'
union
select table_name from dba_tables where user = 'Y')
minus
(select table_name from dba_tables where user = 'X'
intersect
select table_name from dba_tables where user = 'Y')
vd8tlhqk

vd8tlhqk5#

-- get not intersect data
SELECT_FINAL
WHERE FIELD_PK IS NOT IN(
    -- get ids of intersect
    SELECT_AUX FIELD_PK1 FROM (
        SELECT1
        INTERSECT
        SELECT2
     )
)

我来

dgsult0t

dgsult0t6#

下面是另一个解决方案,这次使用count()分析(Oracle 10或更高版本)。
优点:

  • 我们可以指定对哪些列进行EXTRASECT(例如,KK1,KK2)。
  • 我们可以选择非键列(例如,NK1 NK2...在这个例子中),我们不需要匹配。
  • 有效的计划。
  • 类似于FULL OUTER JOIN示例,但我们没有将键列作为需要解码或大小写的单独字段来将它们折叠在一起。

select KK1, KK2, NK1, NK2 from ( select KK1, KK2, NK1, NK2, count( * ) over( partition by KK1, KK2 ) cnt from ( select KK1, KK2, NK1, NK2 from X union all select KK1, KK2, NK1, NK2 from Y ) ) where cnt = 1;

8oomwypt

8oomwypt7#

我有2个数据集表1
ID名称
1 A
B
3C
7 D
表2 ID名称
1 A 2 B 4 E 6 F(select * from table1 minus select * from table2)Union(select * from table2 minus select * from table1)

相关问题