Oracle 查询SQL语句报 ORA-00918: column ambiguously defined(Navicat中)

原有的SQL语句是:

SELECT
	* 
FROM
	(
	SELECT
		i.ID,
		i.NAME,
		i.code,
		i.num,
		i.state,
		i.unit,
		i.TYPE,
		i.addtime,
		i.TIME,
		i.userid,
		i.lastmodified,
		i.modifiedby,
		i.isdel,
		i.deptcode,
		i.manufacturer,
		i.productiondate,
		i.stationid,
		i.OFFICEID,
		s.NAME storeid,
		H.NAME houseid,
		A.NAME areaid 
	FROM
		AE_INVOICING_INVENTORY i,
		AD_YJZY_STOREHOUSE s,
		AD_YJZY_HOUSE H,
		AD_YJZY_AREA A 
	WHERE
		i.storeid = s.ID ( + ) 
		AND i.houseid = H.ID ( + ) 
		AND i.areaid = A.ID ( + ) 
	) T 
WHERE
	1 = 1 
	AND T.isdel = 0 
	AND deptcode IN (
	SELECT DISTINCT
		( sd.RANGE ) AS depcode 
	FROM
		sys_user su,
		sys_depart_user sdu,
		sys_depart sd 
	WHERE
		su.ID = sdu.userid 
		AND sd.ID = sdu.departid 
		AND su.ID = '022bc57b-5b83-43f4-9baf-b37d7782ca03' UNION
	SELECT DISTINCT
		( ydr.dataid ) AS depcode 
	FROM
		sys_user su,
		sys_role sr,
		sys_user_role sur,
		yw_data_role ydr 
	WHERE
		su.ID = sur.userid 
		AND sr.ID = sur.roleid 
		AND ydr.roleid = sr.ID 
		AND su.ID = '022bc57b-5b83-43f4-9baf-b37d7782ca03' 
	) 
ORDER BY
	T.addtime DESC

后来因为需求的原因得改变查询 i 表中所有的字段,变成i.*,因为使用Oracle经验少,导致错误,大家一起看一下!

SELECT
	* 
FROM
	(
	SELECT
		i.*,
		s.NAME storeid,
		H.NAME houseid,
		A.NAME areaid 
	FROM
		AE_INVOICING_INVENTORY i,
		AD_YJZY_STOREHOUSE s,
		AD_YJZY_HOUSE H,
		AD_YJZY_AREA A 
	WHERE
		i.storeid = s.ID ( + ) 
		AND i.houseid = H.ID ( + ) 
		AND i.areaid = A.ID ( + ) 
	) T 
WHERE
	1 = 1 
	AND T.isdel = 0 
	AND deptcode IN (
	SELECT DISTINCT
		( sd.RANGE ) AS depcode 
	FROM
		sys_user su,
		sys_depart_user sdu,
		sys_depart sd 
	WHERE
		su.ID = sdu.userid 
		AND sd.ID = sdu.departid 
		AND su.ID = '022bc57b-5b83-43f4-9baf-b37d7782ca03' UNION
	SELECT DISTINCT
		( ydr.dataid ) AS depcode 
	FROM
		sys_user su,
		sys_role sr,
		sys_user_role sur,
		yw_data_role ydr 
	WHERE
		su.ID = sur.userid 
		AND sr.ID = sur.roleid 
		AND ydr.roleid = sr.ID 
		AND su.ID = '022bc57b-5b83-43f4-9baf-b37d7782ca03' 
	) 
ORDER BY
	T.addtime DESC

 这个在Navicat中运行就出错> ORA-00918: column ambiguously defined,我弄了好长时间,我也在网上查过这个错误原因说是字段某列定义模糊,后来因为我华伟哥一句话把我点醒了,于是我就把别名修改了一下,后来一下成功了,原因就是别名和i 表中的字段冲突了,接下来看一下正确SQL语句:

SELECT
	* 
FROM
	(
	SELECT
		i.*,
		s.NAME AS storeid11,
		H.NAME houseid11,
		A.NAME areaid11 
	FROM
		AE_INVOICING_INVENTORY i,
		AD_YJZY_STOREHOUSE s,
		AD_YJZY_HOUSE H,
		AD_YJZY_AREA A 
	WHERE
		i.storeid = s.ID ( + ) 
		AND i.houseid = H.ID ( + ) 
		AND i.areaid = A.ID ( + ) 
	) T 
WHERE
	1 = 1 
	AND T.isdel = 0 
	AND deptcode IN (
	SELECT DISTINCT
		( sd.RANGE ) AS depcode 
	FROM
		sys_user su,
		sys_depart_user sdu,
		sys_depart sd 
	WHERE
		su.ID = sdu.userid 
		AND sd.ID = sdu.departid 
		AND su.ID = '022bc57b-5b83-43f4-9baf-b37d7782ca03' UNION
	SELECT DISTINCT
		( ydr.dataid ) AS depcode 
	FROM
		sys_user su,
		sys_role sr,
		sys_user_role sur,
		yw_data_role ydr 
	WHERE
		su.ID = sur.userid 
		AND sr.ID = sur.roleid 
		AND ydr.roleid = sr.ID 
		AND su.ID = '022bc57b-5b83-43f4-9baf-b37d7782ca03' 
	) 
ORDER BY
	T.addtime DESC

整个过程的变化过程,短短的变化过程,花费了很长时间,还是经验太少啊!

过程图:

大神勿喷,欢迎留言! 

 

### 回答1: ORA-00918错误是在SQL查询出现的错误之一,它的含义是列有歧义,即在查询指定的列名存在歧义,Oracle无法识别它们。通常情况下,这种错误是由于在查询使用了不明确的列名而引起的。 解决这个问题的一种方法是明确指定列名,以确保Oracle可以正确地识别它们。您可以通过在列名前面加上表名或别名来明确指定列名,例如:table_name.column_name或alias.column_name。这可以消除歧义,使Oracle能够正确地解析查询。 ### 回答2: ORA-00918 错误是Oracle数据库常见的错误类型之一。它出现的原因是因为SQL语句存在多个列名不明确或者重复定义的情况。 当我们在SQL语句使用多个表或视图查询数据时,有可能出现多个表的列名相同,或者一个表存在多个列名相同的情况。这时候,如果我们在SQL语句对这些列名不明确或重复定义,就会导致ORA-00918错误。 解决ORA-00918错误的方法有以下几种: 1.使用完整的列名 建议在SQL语句使用完整的列名,例如"select table1.column1, table2.column2 from table1, table2",通过指定表名.列名的格式来避免出现列名不明确或重复的问题。 2.使用别名 使用别名可以在SQL语句给列名或表名取一个新的名称,例如"select t1.column1 as c1, t2.column2 as c2 from table1 t1, table2 t2",这样可以避免出现列名不明确或重复的问题。 3.避免使用"*"通配符 在SQL语句尽可能避免使用"*"通配符,例如"select * from table1, table2",这样会导致出现多个列名相同的情况,从而容易产生ORA-00918错误。 4.检查SQL语句是否有语法错误 如果通过以上方法仍然无法解决ORA-00918错误,那么我们需要仔细检查SQL语句是否存在语法错误。可能是SQL语句的表名或列名写错了,或者SQL语句缺少了必要的关键字。 总之,避免列名不明确或重复定义是解决ORA-00918错误的关键。只要我们在SQL语句使用完整的列名或别名,或者避免使用通配符,就可以避免这个错误的发生。 ### 回答3: ORA-00918Oracle数据库的一个错误代码,表示“列定义不明确”,通常是在执行SQL语句时发生的错误。 出现这个错误的原因是,SELECT语句的列名在多个表或子查询都存在,而Oracle无法确定要从哪个表或子查询检索该列。这种情况下,需要明确指定列名来避免歧义。 解决这个问题有以下几种方法: 1. 消除歧义:在SELECT语句使用表名或表别名指定列名,类似于“表名.列名”或“表别名.列名”的格式。 例如,假设有两个表A和B,且两张表都有一个名为“id”的列。如果要从这两个表选择“id”列,则可以使用类似于“SELECT A.id, B.id FROM A, B”这样的查询语句,来消除歧义。 2. 使用AS关键字指定别名:在SELECT语句使用AS关键字为列指定别名,这也可以消除歧义。 例如,假设有两个表A和B,其两个表都有一个名为“name”的列。如果要从这两个表选择“name”列,则可以使用如下SQL语句: SELECT A.name AS A_name, B.name AS B_name FROM A, B 这样,可以将A表的“name”列重命名为“A_name”,将B表的“name”列重命名为“B_name”,从而消除歧义。 3. 在WHERE子句使用表名或表别名:与第一种方法类似,如果在WHERE子句列名存在歧义,可以使用表名或表别名指定列名。 例如,假设有两个表A和B,其两个表都有一个名为“age”的列。如果要根据年龄查询数据,则可以使用如下SQL语句: SELECT * FROM A, B WHERE A.age > 18 AND B.age < 30 这样,可以明确地指定使用A表的“age”列和B表的“age”列,从而避免歧义。 总之,ORA-00918错误的出现是因为SQL语句列名存在歧义,需要使用以上方法来消除歧义。当然,在编写SQL语句时也应该尽量避免命名重复的列名。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值