programing

왼쪽 외부 조인에서 중복 제거

lastcode 2023. 7. 6. 22:16
반응형

왼쪽 외부 조인에서 중복 제거

제 질문은 왼쪽 조인을 제한하는 것과 매우 유사합니다.

테이블 숍과 다른 테이블 위치가 있다고 가정합니다.위치는 관심 있는 두 개의 열이 있는 SHOP 테이블의 하위 테이블로, 하나는 분할 키(키만이라고 함)와 "SHOP" 번호입니다.이것은 SHOP 테이블의 숫자 "NO"와 일치합니다.

왼쪽 바깥쪽 결합을 시도했습니다.

SELECT S.NO, L.KEY
FROM SHOP S
LEFT OUTER JOIN LOCATN L ON S.NO = L.SHOP

하지만 한 가게에 속한 곳이 많아서 중복되는 곳이 많아요.저는 그들을 제거하고 중복되지 않은 "샵, 키" 항목의 목록을 얻고 싶습니다.

데이터는 올바르지만 중복 항목은 다음과 같습니다.

SHOP     KEY
 1       XXX
 1       XXX
 2       YYY
 3       ZZZ
 3       ZZZ  etc.

대신 데이터를 다음과 같이 표시합니다.

SHOP     KEY
 1       XXX
 2       YYY
 3       ZZZ  etc.

SHOP 테이블:

 NO
 1       
 2       
 3       

위치 표:

 LOCATION   SHOP  KEY
   L-1       1    XXX   
   L-2       1    XXX   
   L-3       2    YYY   
   L-4       3    YYY   
   L-5       3    YYY   

(ORACLE 10g 데이터베이스)

'S'를 기준으로 그룹화해야 합니다.'아니오' & 'L.KEY'

SELECT S.NO, L.KEY 
FROM SHOP S 
LEFT OUTER JOIN LOCATN L 
ON S.NO = L.SHOP
GROUP BY S.NO, L.KEY

EDIT 시나리오의 업데이트 후 진행

간단한 하위 쿼리로 이 작업을 수행할 수 있어야 합니다(Oracle 데이터베이스에 대해 테스트한 적은 없지만).다음과 같은 것.

UPDATE shop s
SET divnkey = (SELECT DISTINCT L.KEY FROM LOCATN L WHERE S.NO = L.SHOP)

위의 내용은 상점이 여러 디비전에 있는 위치와 연결된 경우 오류를 발생시킵니다.

이 가능성을 무시하고 해당 이벤트에서 임의의 가능성을 선택하려면 사용할 수 있습니다.

UPDATE shop s
SET divnkey = (SELECT MAX(L.KEY) FROM LOCATN L WHERE S.NO = L.SHOP)

저도 이 문제가 있었지만 텍스트 유형 필드를 반환하는 중이었기 때문에 GROUP BY를 사용하여 수정할 수 없었습니다. (DISTINCT 사용도 마찬가지입니다.)

이 코드는 중복 항목을 제공했습니다.

select mx.*, case isnull(ty.ty_id,0) when 0 then 'N' else 'Y' end as inuse 
from master_x mx 
left outer join thing_y ty on mx.rpt_id = ty.rpt_id

나는 이렇게 다시 써서 그것을(를)

select mx.*, 
case when exists (select 1 from thing_y ty where mx.rpt_id = ty.rpt_id) then 'Y' else 'N' end as inuse
from master_x mx 

보시다시피 저는 두 번째 표 내의 데이터에 대해 신경 쓰지 않았습니다.thing_y), 단지 0개 이상의 일치 항목이 있는지 여부입니다.rpt_id그 안에. (FYI:rpt_id또한 첫 번째 테이블의 기본 키가 아니었습니다.master_x).

언급URL : https://stackoverflow.com/questions/2533310/remove-duplicates-from-left-outer-join

반응형