update SYS_WORDBOOK T set col_name=nvl(
                                       (select item_name from RS_SAL_ITEM_ON where table_item_on=T.COL_CODE), col_name ),
                          show_name=nvl(
                                       (select item_name from RS_SAL_ITEM_ON where table_item_on=T.COL_CODE),col_name ),
                          T.issearch=decode(
                                       (select count(*) from RS_SAL_ITEM_ON where table_item_on=T.Col_Code),1,'Y','N')
 WHERE T.Table_Code='RS_SAL_TABLE_FILE' 
and instr(T.COL_CODE,'ITEM_')=1这个语句执行是错误的,“单行子查询返回多于一行”我不知怎么改,再就是看不懂
decode((select count(*) from RS_SAL_ITEM_ON where table_item_on=T.Col_Code),1,'Y','N')
是什么意思,我查了一下decode函数,如果第一个参数是个表达式,如果值是1是“Y”否则是“N”,但我试了一下
count(*)是个数字,是84,子查询结果是“N”
我搞不清怎么回事

解决方案 »

  1.   

    那个decode就是让SYS_WORDBOOK表中issearch这个字段为'Y'或者'N'
      

  2.   

    我觉得,既然是count(*)是84,那么更新的时候好像肯定会返回多于一行阿也不太明白这个sql的意图,期待高人来解答
      

  3.   

    数据原因,
    update sys_wordbook t
       set col_name   = nvl((select item_name
                              from rs_sal_item_on
                             where table_item_on = t.col_code),
                            col_name),
           show_name  = nvl((select item_name
                              from rs_sal_item_on
                             where table_item_on = t.col_code),
                            col_name),
           t.issearch = decode((select count(*)
                                 from rs_sal_item_on
                                where table_item_on = t.col_code),
                               1,
                               'Y',
                               'N')
     where t.table_code = 'RS_SAL_TABLE_FILE'
       and instr(t.col_code, 'ITEM_') = 1col_name和show_name赋值的时候,要求从rs_sal_item_on中查询出来的是唯一的值,如果查出来的是2rows或更多的记录,则会报错。
      

  4.   

    decode((select   count(*)   from   RS_SAL_ITEM_ON   where   table_item_on=T.Col_Code),1,'Y','N')  的意思就是如果"(select   count(*)   from   RS_SAL_ITEM_ON   where   table_item_on=T.Col_Code)语句的值等于“1”那么他的什就会返回'Y'否则就返回'N'.
    可以理解为
    if   (select   count(*)   from   RS_SAL_ITEM_ON   where   table_item_on=T.Col_Code)=1 then
    return 'y';
    else 
    return 'n';
      

  5.   

    1: 首先看下面的语句的count数是不是大于1:
    SELECT COUNT(1)
      FROM SYS_WORDBOOK T
     WHERE T.Table_Code = 'RS_SAL_TABLE_FILE'
       AND instr(T.COL_CODE, 'ITEM_') = 1;如果是大于1的,那么报错就是肯定了的。因为对col_name和show_name进行update操作时要保证查询出来的值唯一、也就是只有一个值。2: T.issearch = decode((select count(*)
                                 from RS_SAL_ITEM_ON
                                where table_item_on = T.Col_Code),
                                1,
                               'Y',
                               'N')
    这段sql代码的意思是:当你count出来的值是1的时候,那decode()的值就是'Y';如果不是1(也就是除了1之外的情况),那么decode()的值就是'N'.
    所以我觉得应该是'instr(T.COL_CODE, 'ITEM_') = 1'这里的原因,LZ看看就可以知道了 ..
      

  6.   

    我不知怎么改,再就是看不懂 
    decode((select   count(*)   from   RS_SAL_ITEM_ON   where   table_item_on=T.Col_Code),1,'Y','N') 
    是什么意思,我查了一下decode函数,如果第一个参数是个表达式,如果值是1是“Y”否则是“N”,但我试了一下 
    count(*)是个数字,是84,子查询结果是“N” 
    我搞不清怎么回事 *********************这个语句的意思是:(select   count(*)   from   RS_SAL_ITEM_ON   where   table_item_on=T.Col_Code) 返回的结果如果是 1 (也就是只有一条记录)的话,就将t.issearch 赋值为 “Y”,否则 赋值为 “N”至于语句报错则是heyixiang 所说的 
    col_name和show_name赋值的时候,要求从rs_sal_item_on中查询出来的是唯一的值,如果查出来的是2rows或更多的记录,则会报错。 你要从业务逻辑上分析是不是哪里有什么条件没有限制好,或者那个值根本就不可能唯一,那就是你的业务方面的问题了。
    或者虽然有两个或多个值但每个值都是相同的,那么你可以加一个ROWNUM<2来限制一下。