首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > oracle >

可以不可以又select *后面接nvl((select a from b),0) from 这样

2013-03-13 
可以不可以再select *,后面接nvl((select a from b),0) from 这样可以不可以再select *,后面接nvl((select

可以不可以再select *,后面接nvl((select a from b),0) from 这样
可以不可以再select *,后面接nvl((select a from b),0) from 这样,我这样写遇到个错误,提示
*,语法错误,未找到FROM关键字
[解决办法]
试试在 * 号前面加个 t

SELECT 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
[解决办法]
可以不可以又select *后面接nvl((select a from b),0) from 这样
为何...我也不清楚最根本的原因.
我的回答是Oracle的基本语法规定的:使用*查询所有列以外的数据时,要加 表别名.*
今天上午就研究你提的这个问题了可以不可以又select *后面接nvl((select a from b),0) from 这样
一会或许有高手来回答,我去查查~
你的需求可以改成这样试试:


  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(+);

热点排行