왼쪽 외부 조인에서 중복 제거
제 질문은 왼쪽 조인을 제한하는 것과 매우 유사합니다.
테이블 숍과 다른 테이블 위치가 있다고 가정합니다.위치는 관심 있는 두 개의 열이 있는 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
'programing' 카테고리의 다른 글
SQL Server 2008에서 SQL Profiler는 어디에 있습니까? (0) | 2023.07.06 |
---|---|
스크립트 열거형에 문자열 값을 할당할 수 없습니다(Initializer 유형 문자열을 변수 유형에 할당할 수 없음). (0) | 2023.07.06 |
*nix 서버에서 ASP.NET Core용 프로덕션에서 사용 중인 웹 서버는 무엇입니까? (0) | 2023.07.06 |
Vuex 상태에서 kazon/vue-i18n 사용 (0) | 2023.07.06 |
Oracle CLOB가 4000자를 초과하여 삽입할 수 없습니까? (0) | 2023.07.06 |