database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 41057 게시물 읽기
No. 41057
쿼리해석 부탁합니다
작성자
바랑
작성일
2016-01-21 14:00ⓒ
2016-01-21 14:50ⓜ
조회수
9,554

WITH A_BOM1 AS (

SELECT 'BOM1' AS BOMID , 'A' AS TO_ITEM , 'a' as FROM_ITEM from dual

UNION ALL

SELECT 'BOM1' AS BOMID , 'A' AS TO_ITEM , 'b' as from_item from dual

UNION ALL

SELECT 'BOM1' AS BOMID , 'A' AS TO_ITEM , 'c' as from_item from dual

UNION ALL

SELECT 'BOM2' AS BOMID , 'A' AS TO_ITEM , 'a' as from_item from dual

UNION ALL

SELECT 'BOM2' AS BOMID , 'A' AS TO_ITEM , 'b' as from_item from dual

UNION ALL

SELECT 'BOM2' AS BOMID , 'A' AS TO_ITEM , 'c' as from_item from dual

UNION ALL

SELECT 'BOM3' AS BOMID , 'A' AS TO_ITEM , 'a' as from_item from dual

UNION ALL

SELECT 'BOM3' AS BOMID , 'A' AS TO_ITEM , 'c' as from_item from dual

UNION ALL

SELECT 'BOM3' AS BOMID , 'A' AS TO_ITEM , 'd' as from_item from dual

)

SELECT

*

FROM (

SELECT

BOMID, A1

,RANK() OVER (PARTITION BY A1 ORDER BY ROWNUM) A2

FROM (

SELECT

BOMID,

LISTAGG(ITEM_SEQ,',') WITHIN GROUP (ORDER BY BOMID,ITEM_SEQ) A1

FROM (

SELECT BOMID ,

TO_ITEM||FROM_ITEM ,

DENSE_RANK () OVER(ORDER BY TO_ITEM||FROM_ITEM ) AS ITEM_SEQ

FROM A_BOM

)

GROUP BY BOMID

)

)

WHERE A2 > 1

이 글에 대한 댓글이 총 1건 있습니다.

WITH a_bom1 AS
(
SELECT 'BOM1' bomid, 'A' to_item, 'a' from_item FROM dual
UNION ALL SELECT 'BOM1', 'A', 'b' FROM dual
UNION ALL SELECT 'BOM1', 'A', 'c' FROM dual
UNION ALL SELECT 'BOM2', 'A', 'a' FROM dual
UNION ALL SELECT 'BOM2', 'A', 'b' FROM dual
UNION ALL SELECT 'BOM2', 'A', 'c' FROM dual
UNION ALL SELECT 'BOM3', 'A', 'a' FROM dual
UNION ALL SELECT 'BOM3', 'A', 'c' FROM dual
UNION ALL SELECT 'BOM3', 'A', 'd' FROM dual
)
-- Step.3. --
SELECT *
  FROM ( -- Step.2. --
        SELECT bomid, a1
             , RANK() OVER (PARTITION BY a1 ORDER BY ROWNUM) a2
          FROM ( -- Step.1. --
                SELECT bomid
                     , LISTAGG(to_item||from_item,'')
                       WITHIN GROUP (ORDER BY bomid) a1
                  FROM a_bom1 a
                 GROUP BY bomid
                )
        )
 WHERE a2 > 1
;


단계별로 수행하면서 결과 확인하세요.
1. bomid 별로 to_item||from_item 묶기
  BOMID A1
  ----- ------
  BOM1  AaAbAc
  BOM2  AaAbAc
  BOM3  AaAcAd
2. A1 별로 Rank 구하기
  BOMID A1     A2
  ----- ------ --
  BOM1  AaAbAc  1
  BOM2  AaAbAc  2
  BOM3  AaAcAd  1
3. A2 > 1 걸러내기
  BOMID A1     A2
  ----- ------ --
  BOM2  AaAbAc  2


BOM1 과 BOM2 의 자료들이 모두 일치합니다.(A1)
이렇게 중복되는 자료를 찾는 것 같네요.


그런데 문제점
정렬 기준이 명확하지 않습니다.
1단계 정렬 기준인 bomid 는 그룹 기준과 동일합니다.
  즉, 그룹 안에서의 정렬기준으로 적당하지 않습니다.
  그룹 안에서 bomid 가 모두 동일하기 때문에 어떻게 정렬될 지 알 수 없습니다.
  따라서 유니크한 정렬기준을 줄 필요가 있습니다.
2단계 정렬 기준인 ROWNUM 도 모호합니다.
  최종결과가 BOM2 가 나왔지만 BOM1 이 나온다고 해도 전혀 이상하지 않습니다.
  결과가 달라질 수 있는 가능성이 있어서는 안되죠.
  정렬기준이 bomid 가 되어야 맞습니다.

마농(manon94)님이 2016-01-21 19:27에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
41061ROWNUM 관련 질문입니다. [2]
조동건
2016-01-24
8418
41060auto increment trigger 관련 질문입니다.
조동건
2016-01-22
8629
41058데이터 삭제시 속도 문제 문의 [2]
이성근
2016-01-22
8767
41057쿼리해석 부탁합니다 [1]
바랑
2016-01-21
9554
41056ROW를 합치고 싶습니다. [2]
저격왕
2016-01-21
9084
41055쿼리좀 알려주세요... [1]
피어스
2016-01-20
8669
41054쿼리 도움이요..쉬운듯 한데 안되네요. [3]
gome
2016-01-20
8849
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다