SQL Developer에서 다 대다 관계 집계 또는 번들
그래서 2 개의 열이있는 하나의 단일 테이블이 있습니다. Sales_Order ccso
, Arrangement라고합니다 arrmap
. 테이블에는이 조합에 대한 고유 한 값이 있으며이 두 필드는 다 대다 관계를 갖습니다.
- 1
ccso
은 다중을 가질 수 있습니다arrmap
- 1
arrmap
은 다중을 가질 수 있습니다ccso
이러한 모든 조합은 하나의 단일 번들로 간주되어야합니다.
목표 : 각 판매 주문에 해당 번들에서 가장 큰 배열로 최종 맵을 할당합니다.
예 : ccso : 100-10015에는 3 개의 배열이 있습니다-> 이제 각 배열에 판매 주문 세트가 있습니다-> 이제 해당 판매 주문에도 다른 배열 목록이 포함됩니다 (이미지 : 1 ).
따라서 대답은 확실히 재귀 적으로 확인하는 것을 가리 킵니다. 나는 아래 코드 / 코드를 작성할 수 있었고 where 절에서 ccso를 하드 코딩하는 한 작동합니다.하지만 지금은 어떻게 진행해야할지 모르겠습니다. (저는 직업 회계사이지만 최근 코딩에 더 많은 열정을 가지고 있습니다.) 포럼과 웹에서 다음과 같은 사항을 검색했습니다.
- 재귀 CTE,
- 다 대다 집계
- 데카르트 제품 등이 있으며 아직 모르는 용어가 있어야한다고 확신합니다. 또한 sqldeveloper 또는 googlesheet 쿼리 및 필터 수식을 사용하려고 시도했습니다. sqldeveloper는 일부 CTE에 대한 제한이 있습니다. 재귀가 4 회 또는 5 회 반복을 말하도록 깊이를 제어 할 수있는 방법과 방법을 알고 싶습니다.
이상적으로는 가능한 경우 최종 맵으로 세 번째 열을 업데이트하고 싶지만 그렇지 않은 경우 선택 쿼리 결과가 좋습니다.
내가 시도한 코드
코드 1 : 스크린 샷에 따라
WITH a1(ccso, amap) AS
(SELECT distinct a.ccso, a.arrmap
FROM rg_consol_map2 A
WHERE a.ccso = '100-10115' -- this condition defines the ultimate ancestors in your chain, change it as appropriate
UNION ALL
SELECT m.ccso, m.arrmap
FROM rg_consol_map2 m
JOIN a1
ON M.arrmap = a1.amap -- or m.ccso=a1.ccso
) /*if*/ CYCLE amap SET nemap TO 1 /*else*/ DEFAULT 0
SELECT DISTINCT amap FROM (SELECT ccso, amap FROM a1 ORDER BY 1 DESC) WHERE ROWNUM = 1
여기서 주요 과제는 하드 코딩 된 ccso를 제거하고 각 ccso에 대한 조인을 수행하는 방법입니다.
코드 2 : 깊이를위한 수동 CTE 여기서 다시 CTE 외부의 조인은 오류를 발생시키고 sqldeveloper는 UPDATE 문과 함께 WITH 절을 허용하지 않습니다. 선택에 대해서만 작동하며 하위 테이블로 대괄호로 묶일 수 없습니다.
SELECT distinct ccso FROM
(
WITH ar1 AS
(SELECT distinct arrmap
FROM rg_consol_map
WHERE ccso = a.ccso
)
,so1 AS
(SELECT DISTINCT ccso
FROM rg_consol_map
WHERE arrmap IN (SELECT arrmap FROM ar1)
)
,ar2 AS
(SELECT DISTINCT ccso FROM rg_consol_map
where arrmap IN (select distinct arrmap FROM rg_consol_map
WHERE ccso IN (SELECT ccso FROM so1)
))
SELECT ar1.arrmap, NULL ccso FROM ar1
union all
SELECT null, ar2.ccso FROM ar2
UNION ALL
SELECT NULL arrmap, so1.ccso FROM so1
)
여기에 뭔가가 누락되었거나 더 쉬운 방법이 있습니까? MERGE 및 PROC SQL JOIN에 대해 읽었지만 작동하도록 할 수 없었지만 계속 진행할 수 있다면 누군가가 나를 방향으로 가리킬 수 있다면 더 시도 할 것입니다 (이미지 : 2 )
(CSV 파일 : [3])
편집 : CSV 파일 링크 수정 https://github.com/karan360note/karanstackoverflow.git여기에서 IC 매핑을 많이 다운로드 할 수 있다고 생각 합니다 .csv
Oracle 11g 버전이 사용 중입니다.

답변
텍스트 벽에 대해 미리 사과드립니다.
문제는 복잡한 다층 다 대다 쿼리입니다. 끔찍하게 이상적인 디자인 선택이 아니기 때문에 이에 대한 "쉬운"해결책은 없습니다. 내가 아는 유일한 방법은 반복적으로 앵커 열 (예 : "parentID")에 의존하여 선형으로 재귀를 지시하기 때문에 가장 안전한 방법은 문자 그대로 여러 계층의 CTE 또는 하위 쿼리를 포함하여 원하는 모든 깊이를 달성하는 것입니다. 패션. 여기에는 그 옵션이 없습니다. 우리는 경로를 추적 할 방법없이 원을 그리며 갈 것입니다.
따라서 기본적으로 여러 하위 쿼리를 사용했습니다. 모든 레벨은 a) 특정 ARRMAP 항목을 포함하는 모든 주문을 확인한 다음 b) 해당 주문에 대한 모든 추가 항목을 확인합니다. 논리를보고 필요에 맞게 수정할 수있을만큼 명확합니다. 원래 CCSO, 연결 ARRMAP 및 관련 CCSO를 포함하는 새 테이블을 생성합니다. 링크:https://pastebin.com/un70JnpA
이렇게하면 주문 번호 또는 주문 날짜 등을 기반으로 훨씬 더 간단한 방식으로 돌아가서 원하는 업데이트를 수행 할 수 있습니다. 앵커 열이 있으면 향후 CTE가 훨씬 더 간단 해집니다 ( "CTE 재귀 트리 계층 구조"를 검색하면됩니다).
SELECT DISTINCT
CCSO, RELATEDORDER
FROM myTempTable
WHERE CCSO = '100-10115'; /* to find all orders by CCSO, query SELECT DISTINCT RELATEDORDER */
--WHERE ARRMAP = 'ARR10524'; /* to find all orders by ARRMAP, query SELECT DISTINCT CCSO */
편집하다:
이 테이블이 생성하는 것을 더 잘 설명하기 위해 문제를 단순화하겠습니다.
주문이있는 경우
- A, 배열 1과 2;
- B, 배열 2, 3; 과
- 배열 3의 C;
그러면 초기 문의 및 이미지를 통해 주문 A는 주문 B 및 C와 관련되어야합니다. DISTINCT ccso, relatedOrder를 선택하면 쿼리가 다음 테이블을 생성합니다.
+-------+--------------+
| CCSO | RelatedOrder |
+----------------------+
| A | B |
| A | C |
+----------------------+
| B | C |
| B | A |
+----------------------+
| C | A |
| C | B |
+-------+--------------+
여기에서 쿼리 WHERE CCSO = 'A' OR RelatedOrder = 'A'
하면 두 열 사이에서 뒤집힌 동일한 관계를 얻을 수 있습니다.
+-------+--------------+
| CCSO | RelatedOrder |
+----------------------+
| A | B |
| A | C |
+----------------------+
| B | A |
+----------------------+
| C | A |
+-------+--------------+
따라서 CCSO 또는 RelatedOrder 만 쿼리하십시오.
의 결과는 여기WHERE CCSO = '100-10115'
이미지를 참조하십시오. 여기 에는 이미지 # 1에 표시 한 모든 링크와 추가 관계 깊이가 포함되어 있습니다.