2010-06-22 78 views
0

我在我的数据库中有两个像下面这样的表。在evry DEPARTMENT_CODE的第一个ITEM项目中,会有多个ITEM_CODE。Oracle多重更新查询

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" 
------------------------------------------------------------- 

在表COMPETITOR埃维ITEMCODE将有三个条目,并具有该

不同competitor_Code我有三个值COMP_1,comp_2,comp_3和department_code = 14;

我想做的事是COMP_1,comp_2,comp_3对于埃夫里ITEM_CODE这ITEM表已department_code 14个更新COMPETITOR表

样本输出

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" 
------------------------------------------------------------- 

我怎么能写一个Oracle查询这个?

回答

2

以下内容假定ITEM_CODE仅分配给一个DEPARTMENT_CODE,因为它很简单,并且您没有给我们任何其他业务规则。这个假设是错误的,你需要相应地调整逻辑。

我还纳入您的要求,COMPETITOT.COMPETITOR_CODE的现有值是不可靠的。

鉴于本次测试日期:

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> 

我们可以用一个解析ROW_NUMBER()来生成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 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 2010-06-22 07:36:34

+3

@Jasim - 如果您希望我们提供帮助,您应该提前向我们提供所有相关信息。 – APC 2010-06-22 09:56:34