programing

Oracle의 INSTRECT의 반대쪽

instargram 2023. 9. 9. 08:51
반응형

Oracle의 INSTRECT의 반대쪽

두 개의 선택 항목이 있는데 두 선택 항목에서 고유한 행만 반환되도록 결합하고 싶습니다.Oracle 10g에 이를 위한 기본 제공 방법이 있습니까?

나는 내가 이런 일을 할 수 있다는 것을 압니다.

(선택1 UNION 선택2)마이너스(선택1 INSTRESS 선택2)

하지만 피하고 싶습니다.둘다요.select1그리고.select220개의 선을 가지고 있기 때문에 이 방법은 정말 모호하고 유지하기 어려울 것입니다.

둘 다라면select1그리고.select2중복을 반환하지 마십시오. 다음과 같은 것을 사용할 수 있습니다.

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

Oracle 10g에서는 Common Table Expression을 마음대로 사용할 수 있습니다.

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
);

이렇게 하면 하위 쿼리를 유지할 수 있고 최종 쿼리의 목적이 명확해집니다.

물론, 오라클이 추가로SYM_DIFFERENCESQL로 교환하는 것이 훨씬 낫지만, 저는 숨을 죽이고 싶지 않습니다. 그들은 여전히 다음과 같은 것을 확신하지 못합니다.BOOLEAN데이터 타입이 좋을 것 같습니다.

또 다른 아이디어가 있습니다.

  • 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

이게 저한테 효과가 있었어요. 얼마나 빠른지는 잘 모르겠어요.

(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')
-- get not intersect data
SELECT_FINAL
WHERE FIELD_PK IS NOT IN(
    -- get ids of intersect
    SELECT_AUX FIELD_PK1 FROM (
        SELECT1
        INTERSECT
        SELECT2
     )
)

저는 그걸 해요.

여기에 또 다른 해결책이 있습니다. 이번에는 count() analytic(Oracle 10 이상)을 사용합니다.

장점:

  • 우리는 EXTEXTECT에 어떤 열이 있는지 지정할 수 있습니다(예: 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;

데이터셋이 2개 있습니다. 표 1
아이디명
1 A
2 B
3 C
7 D

표 2 ID 이름
1 A 2 B 4 E 6 F (표 1에서 * 선택 - 표 2에서 * 선택)Union (표 2에서 *를 선택하고 표 1에서 *를 선택합니다)

언급URL : https://stackoverflow.com/questions/1593038/opposite-of-intersect-in-oracle

반응형