可以不可以再select *,后面接nvl((select a from b),0) from 这样,我这样写遇到个错误,提示
*,语法错误,未找到FROM关键字

解决方案 »

  1.   


    SELECT *, nvl((SELECT region_name FROM ws_region WHERE region_id=t.village_id), '村委会不详') village_name FROM s_ehr_statistics_village t WHERE 1=1
      

  2.   

    1.select *
    change to --> select T.*2.NVL内的query
    if WS_REGIN中有重复的REGION_ID也会报错.
    应该是主键吧.
      

  3.   

    你这个query好怪哦.  SELECT T.*
            ,NVL(W.REGION_NAME,'unknown')
        FROM S_EHR_STATISTICS_VILLAGE T
            ,WS_REGION W
       WHERE 1 = 1
         AND T.VILLAGE_ID = W.REGION_ID(+);
      

  4.   


    谢谢,解决了,小弟实习生初学oracle,之前用sql,不明白为何改为T.*就可以了,可以解释下么
      

  5.   

    试试在 * 号前面加个 tSELECT t.*,
           NVL((SELECT region_name FROM ws_region WHERE region_id = t.village_id),
               '村委会不详') village_name
      FROM s_ehr_statistics_village t
     WHERE 1 = 1=================================
    我一般不写这样的语句,根据ID获取名称的,我一般再写个函数,用函数来获取。如:
    CREATE OR REPLACE FUNCTION EMP.FUNC_GET_EMITION_NAME(in_emition_code IN VARCHAR2)
    /******************************************************************************
      * AUTHOR         -  Xujin.Jiao
      * CREATION DATE  -  2011-08-20
      * SERVICE NAME   -  LanDun
      *
      * PROCEDURE NAME :FUNC_GET_EMITION_NAME
      *
      * DESCRIPTION    :根据排口编码获取对应的排口中文名称
      *
      * Parameters :
      *  in_emition_code      IN  排口编码
      ******************************************************************************
      * POSSIBLE ERROR CONDITIONS :
      ******************************************************************************
      * CHANGE LOG
      ******************************************************************************
      * CHANGE NUMBER:
      * DATE:
      * DEVELOPER:
      * DESCRIPTION:
      *****************************************************************************/
      RETURN VARCHAR2 AS
      v_name                VARCHAR2(100);
      v_prm_code            NUMBER;
      v_prm_errtext         VARCHAR2(200);
    BEGIN
      IF in_emition_code IS NOT NULL THEN
        BEGIN
           SELECT v.emition_name
             INTO v_name
             FROM emition_list_view v
            WHERE v.emition_code = in_emition_code;
        EXCEPTION
          WHEN no_data_found THEN
            v_name := '';
        END;
      ELSE
        RETURN '';
      END IF;  RETURN v_name;
    EXCEPTION
      WHEN OTHERS THEN
         v_prm_code    := SQLCODE;
         v_prm_errtext := SQLERRM;
         DBMS_OUTPUT.put_line('this error message is from function FUNC_GET_EMITION_NAME.');
         DBMS_OUTPUT.put_line('SQLCODE: ' || v_prm_code);
         DBMS_OUTPUT.put_line('SQLERRM: ' || v_prm_errtext);
         RETURN null;
    END;
    /然后这样用:
    SELECT t.*,
           FUNC_GET_VILLAGE_NAME(t.village_id) village_name
      FROM s_ehr_statistics_village t
     WHERE 1 = 1
      

  6.   

    Quote: 引用 6 楼 jxjinfocus 的回复:

    不是很懂oracle,所以才会那么写。不过看了你的回复!觉的受用很大,我回去参考下你的方法去改进。谢谢
      

  7.   

    Quote: 引用 6 楼 jxjinfocus 的回复:

    试试在 * 号前面加个 t
    为何在前面加个t就可以了呢。小弟实习生,才从sql转到oracle,所以不是很懂。问题简单。见谅下,还望帮我解惑下
      

  8.   


    为何...我也不清楚最根本的原因.
    我的回答是Oracle的基本语法规定的:使用*查询所有列以外的数据时,要加 表别名.*
    今天上午就研究你提的这个问题了
    一会或许有高手来回答,我去查查~
    你的需求可以改成这样试试:  SELECT T.*         
            ,NVL(W.REGION_NAME,'unknown')     
        FROM S_EHR_STATISTICS_VILLAGE T         
            ,WS_REGION W    
       WHERE 1 = 1      
         AND T.VILLAGE_ID = W.REGION_ID(+);
      

  9.   

    Quote: 引用 9 楼 tonypingge 的回复:

    为何...我也不清楚最根本的原因.
    我的回答是Oracle的基本语法规定的:使用*查询所有列以外的数据时,要加 表别名.*
    谢谢啦,因为才从sql转过来 有些ORACLE语法定义不熟悉,现在知道了。太感谢了!
      

  10.   

    因为你这个查询语句中涉及到两张表,如果不指定表别名,仅仅*号,ORACLE
    不知道你是想查表s_ehr_statistics_village 中的所有字段,
    还是查表 ws_region 中的所有字段。
      

  11.   


    你猜这个query会报错吗?only one table. SELECT * 
           ,1   
       FROM gl_je_headers
      

  12.   


    真不像有十年oracle经验的..