2016-03-11 42 views
0
与信息的列

现在我有一个表,假设表属性,它有2分列称为A和B,更新其他3列

A B  PIVOT 
1 dog T 
2 cat T 
1 chien F 
1 gou F 
2 chat F 
2 miao F 

现在我想添加一列C,其含量是基于A和B,并且索引为1.也就是说,

A B  C 
1 dog dog 
2 cat cat 
1 chien dog 
1 gou dog 
2 chat cat 
2 miao cat 

我该怎么做?这是一个大的表(200K行)

我在想:

UPDATE PROPERTY a SET C= 
    (select min(b.B) from CFG_DIM_PROPERTY b where 
      b.A= a.A and b.PIVOT= 'T') 

然而,这个SQL花费了过长的时间。你聪明的人知道其他方式吗?还有一些关于你如何看待它的迹象?

+0

什么是'PIVOT'列的功能? – MT0

+0

当PIVOT为T(真)时,表示C将基于该行的B列。 –

回答

0

为什么不使用合并

merge into PROPERTY t 
using (select min (b) as min_b, a 
     from CFG_DIM_PROPERTY b 
     where b.pivot = 'T' 
     group by a) t1 
on (t.a = t1.a) 
when matched then 
    update set t.c = t1.min_b; 
+0

这对我来说非常合适! –

0

看起来像你想这样的输出?因为您的表格还没有列c。如果你想添加它,你可以使用下面的逻辑来获得它的价值。

另请注意,如果对于每个A,如果有多于1个PIVOT1T,则可能会得到意想不到的结果。

with tbl(A,B,PIVOT1) as( 
    select 1,'dog ','T' from dual union all 
    select 2,'cat ','T' from dual union all 
    select 1,'chien','F' from dual union all 
    select 1,'gou ','F' from dual union all 
    select 2,'chat ','F' from dual union all 
    select 2,'miao ','F' from dual 
    ) 
    select t1.a,t1.b,t2.b as C from tbl t1 left join 
    (select a,b from tbl where pivot1='T') t2 
    on t1.a=t2.a 

输出:

A B  C 
    1 gou dog 
    1 chien dog 
    1 dog dog 
    2 miao cat 
    2 chat cat 
    2 cat cat 
+0

谢谢Utsav,我试着用你的代码第二部分,它工作正常。我想我还是要弄清楚如何将它更新到C列。而且我不明白双重联合的所有部分。 –

+0

子查询因式分解('WITH table_name(column_name,...)AS(。 ..)')只是提供一个数据的模型而不必创建底层表 - 就像你已经有了这个表一样,你可以省略查询的那一点。 – MT0

+0

谢谢MT0 ^^这非常有帮助! –

0
UPDATE PROPERTY p 
SET c = (SELECT b 
      FROM PROPERTY v 
      WHERE p.a  = v.a 
      AND v."PIVOT" = 'T' 
      AND ROWNUM = 1 -- This line may not be necessary if there 
            -- is only ever one 'T' per 'A' 
      ); 
+0

嗨MT0,我没有看到你的时间和我的SQL将花费的时间有差异。指出如果我错了... –

+0

没有“GROUP BY”,并且相关的子查询可以在找到第一行时停止(使用'ROWNUM = 1')。您可以检查'EXPLAIN PLAN'来查看查询之间的区别。 – MT0

+0

噢,谢谢,我刚刚检查过'ROWNUM',是的,你说得对,但它仍然需要很长时间。 :) –