Oracle의 INSTRECT의 반대쪽
두 개의 선택 항목이 있는데 두 선택 항목에서 고유한 행만 반환되도록 결합하고 싶습니다.Oracle 10g에 이를 위한 기본 제공 방법이 있습니까?
나는 내가 이런 일을 할 수 있다는 것을 압니다.
(선택1 UNION 선택2)마이너스(선택1 INSTRESS 선택2)
하지만 피하고 싶습니다.둘다요.select1
그리고.select2
20개의 선을 가지고 있기 때문에 이 방법은 정말 모호하고 유지하기 어려울 것입니다.
둘 다라면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_DIFFERENCE
SQL로 교환하는 것이 훨씬 낫지만, 저는 숨을 죽이고 싶지 않습니다. 그들은 여전히 다음과 같은 것을 확신하지 못합니다.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
'programing' 카테고리의 다른 글
우분투 18에 파이썬 3.7용 핍을 설치하는 방법? (0) | 2023.09.09 |
---|---|
Oracle에서 날짜를 날짜 시간으로 변환하는 방법은 무엇입니까? (0) | 2023.09.09 |
관리되지 않는 C++의 XLL Excel 추가 기능 (0) | 2023.09.04 |
텍스트 보기의 레이아웃 가중치를 프로그래밍 방식으로 설정 (0) | 2023.09.04 |
Grafana - 확대 시 데이터 없음 (0) | 2023.09.04 |