2010-06-22 14 views
0

나는 내 DB에 아래 두 테이블을 가지고 있습니다. evry DEPARTMENT_CODE의 첫 번째 표 ITEM에는 여러 ITEM_CODE가 있습니다. 표 경쟁자 이비에서 오라클 다중 업데이트 쿼리

ITEM 
---------------------------------------------------- 
"STORE_CODE" "ITEM_CODE" "DEPARTMENT_CODE" 
"011"   "912003" "14" 
"011"   "912004" "14" 
"011"   "914001" "14" 
---------------------------------------------------- 

COMPETITOR 
-------------------------------------------------------------- 
"STORE_CODE" "ITEM_CODE" "DEPARTMENT_CODE" "COMPETITOR_CODE" 

"011"  "912003"  "14"  "01" 
"011"  "912003"  "14"  "02" 
"011"  "912003"  "14"  "03" 
"011"  "912004"  "14"  "01" 
"011"  "912004"  "14"  "02" 
"011"  "912004"  "14"  "04" 
"011"  "914001"  "14"  "01" 
"011"  "914001"  "14"  "02" 
"011"  "914001"  "14"  "03" 
------------------------------------------------------------- 

ITEMCODE 세 항목이되고 난 세 값 Comp_1, comp_2, comp_3 및 department_code = 14 갖도록

의 다른 competitor_Code있다;

내가 뭘 원하는

샘플 출력

COMPETITOR 
-------------------------------------------------------------- 
"STORE_CODE" "ITEM_CODE" "DEPARTMENT_CODE" "COMPETITOR_CODE" 

"011"  "912003"  "14"  "Comp_1" 
"011"  "912003"  "14"  "Comp_2" 
"011"  "912003"  "14"  "Comp_3" 
"011"  "912004"  "14"  "Comp_1" 
"011"  "912004"  "14"  "Comp_2" 
"011"  "912004"  "14"  "Comp_3" 
"011"  "914001"  "14"  "Comp_1" 
"011"  "914001"  "14"  "Comp_2" 
"011"  "914001"  "14"  "Comp_3" 
------------------------------------------------------------- 

가 어떻게 하나의 신탁을 쓸 수 comp_1, comp_2, ITEM 테이블에 14로 department_code했다 에브리 Item_code에 대한 comp_3와 업데이트 경쟁자 테이블 이것에 대한 쿼리 ??

답변

2

다음은 ITEM_CODE가 하나의 DEPARTMENT_CODE에만 할당되어 있다고 가정합니다. 간단하고 더 많은 비즈니스 규칙을 제공하지 않았기 때문입니다. 이 가정은 잘못되었으므로 논리를 적절하게 조정해야합니다.

또한 COMPETITOT.COMPETITOR_CODE의 기존 값이 신뢰할 수 없다는 요구 사항을 통합했습니다.

을 감안할 때이 테스트 날짜 : 더 추가를 금지 (

SQL> update competitor c 
    2 set competitor_code = 
    3   (select decode (dr 
    4       , 1, 'Comp_1' 
    5       , 2, 'Comp_2' 
    6       , 3, 'Comp_3') 
    7    from (select row_number() over (partition by x.item_code 
    8             order by x.rowid) as dr 
    9       , x.rowid as row_id 
10     from competitor x 
11     where x.item_code in (select item_code 
12           from item 
13           where department_code = 14)) l 
14    where c.rowid = l.rowid) 
15/

9 rows updated. 

SQL> 

을 그리고이 원하는 결과입니다

SQL> select * from competitor 
    2/

STORE_CODE ITEM_CODE DEPARTMENT_CODE COMPETITOR 
---------- ---------- --------------- ---------- 
     11  912003    14 01 
     11  912003    14 04 
     11  912003    14 03 
     11  912004    14 01 
     11  912004    14 02 
     11  912004    14 04 
     11  914001    14 01 
     11  914001    14 02 
     11  914001    14 05 

9 rows selected. 

SQL> 

우리는 COMPETITOR_CODE에 필요한 핸들을 생성하는 분석 ROW_NUMBER()를 사용할 수 있습니다) 비즈니스 규칙에 :

SQL> select * from competitor 
    2/

STORE_CODE ITEM_CODE DEPARTMENT_CODE COMPETITOR 
---------- ---------- --------------- ---------- 
     11  912003    14 Comp_1 
     11  912003    14 Comp_2 
     11  912003    14 Comp_3 
     11  912004    14 Comp_1 
     11  912004    14 Comp_2 
     11  912004    14 Comp_3 
     11  914001    14 Comp_1 
     11  914001    14 Comp_2 
     11  914001    14 Comp_3 

9 rows selected. 

SQL> 
+0

당신이 (department_code, '01 디코딩을 사용하는 ','Comp_1 ','02 ' , 'Comp_2', '03', 'Comp_3'). 하지만 제 경우에는 어떤 값이 '01', '02', '03'이 될지 알지 못합니다. 그것은 무엇이든 수 있습니다. 단 한 가지는 각 항목에 대해 세 개의 항목이 있다는 것입니다. – Andromeda

+3

@ 자심 - 우리가 도와 주길 원한다면, 모든 정보를 미리 보내야합니다. – APC