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
1.select * change to --> select T.*2.NVL内的query if WS_REGIN中有重复的REGION_ID也会报错. 应该是主键吧.
你这个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(+);
谢谢,解决了,小弟实习生初学oracle,之前用sql,不明白为何改为T.*就可以了,可以解释下么
试试在 * 号前面加个 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
为何...我也不清楚最根本的原因. 我的回答是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(+);
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
change to --> select T.*2.NVL内的query
if WS_REGIN中有重复的REGION_ID也会报错.
应该是主键吧.
,NVL(W.REGION_NAME,'unknown')
FROM S_EHR_STATISTICS_VILLAGE T
,WS_REGION W
WHERE 1 = 1
AND T.VILLAGE_ID = W.REGION_ID(+);
谢谢,解决了,小弟实习生初学oracle,之前用sql,不明白为何改为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
为何...我也不清楚最根本的原因.
我的回答是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(+);
不知道你是想查表s_ehr_statistics_village 中的所有字段,
还是查表 ws_region 中的所有字段。
你猜这个query会报错吗?only one table. SELECT *
,1
FROM gl_je_headers
真不像有十年oracle经验的..