获取ORA-00918:列模糊定义:运行此SQL:
SELECT *
FROM
(SELECT DISTINCT(coaches.id),
people.*,
users.*,
coaches.*
FROM "COACHES"
INNER JOIN people ON people.id = coaches.person_id
INNER JOIN users ON coaches.person_id = users.person_id
LEFT OUTER JOIN organizations_users ON organizations_users.user_id = users.id
) WHERE rownum <= 25
Run Code Online (Sandbox Code Playgroud)
有什么建议吗?
我在Oracle数据库表中有行,对于两个字段的组合应该是唯一的,但是没有在表上设置唯一约束,所以我需要使用SQL找到所有违反约束的行.不幸的是,我的微薄SQL技能无法胜任.
我的表有三列相关:entity_id,station_id和obs_year.对于每一行,station_id和obs_year的组合应该是唯一的,我想通过SQL查询将它们刷出来查明是否存在违反此行的行.
我尝试了以下SQL(由前一个问题提出),但它对我不起作用(我得到ORA-00918列模糊定义):
SELECT
entity_id, station_id, obs_year
FROM
mytable t1
INNER JOIN (
SELECT entity_id, station_id, obs_year FROM mytable
GROUP BY entity_id, station_id, obs_year HAVING COUNT(*) > 1) dupes
ON
t1.station_id = dupes.station_id AND
t1.obs_year = dupes.obs_year
Run Code Online (Sandbox Code Playgroud)
有人可以建议我做错了什么,和/或如何解决这个问题?
我刚刚在Oracle中遇到了一个奇怪的行为,我期望ORA-00918被提升,但事实并非如此.例如,以此查询为例.
SELECT *
FROM USER_TABLES TAB
JOIN USER_TRIGGERS TRG ON TRG.TABLE_NAME = TAB.TABLE_NAME
WHERE STATUS = 'DISABLED'
Run Code Online (Sandbox Code Playgroud)
此查询在概念上寻找具有禁用触发器的表的详细信息,但请注意,这不是我想要解决的问题.该查询,数据字典,视图或表格不是唯一的问题; 据我所知,它适用于任何一组表或视图(从我试过的两三个).
无论如何,尝试运行此查询,你会得到ORA-00918,因为两者USER_TABLES并USER_TRIGGERS有一个名为列STATUS,从而得到查询运行WHERE条款需要更改到TRG.STATUS.好吧,很酷,但尝试加入另一张桌子.
SELECT *
FROM USER_TABLES TAB
JOIN USER_TRIGGERS TRG ON TRG.TABLE_NAME = TAB.TABLE_NAME
JOIN USER_CONSTRAINTS CON ON CON.TABLE_NAME = TAB.TABLE_NAME
WHERE STATUS = 'DISABLED'
Run Code Online (Sandbox Code Playgroud)
这个查询,没有限定你的意思是哪个STATUS列,神奇地工作!别介意语义或查询返回的内容,没有错误. USER_CONSTRAINTS甚至还有一个名称STATUS也是如此,所以当有两列可供选择时它怎么会不知道该怎么做但是它更加模棱两可呢?
顺便说一下,这一切都在10.2.0.3.0上,如果你的查询中有两个以上的表,ORA-00918就会停止被提升.如果这是一个Oracle错误,有人知道它何时被修复,那么如果我们的数据库升级,哪个Oracle版本可能会导致牛仔查询爆炸?
更新
感谢BQ用于演示该错误已在11.2.0.1.0中修复.任何可以在早期版本中修复它的人的赏金!
我写了一个像这样的Oracle SQL表达式:
SELECT
...
FROM mc_current_view a
JOIN account_master am USING (account_no)
JOIN account_master am_loan ON (am.account_no = am_loan.parent_account_no)
JOIN ml_client_account mca USING (account_no)
Run Code Online (Sandbox Code Playgroud)
当我尝试运行它时,Oracle在"ON"自连接行中抛出一个错误:"ORA-25154:USING子句的列部分不能有限定符".
如果我省略"am"限定符,它会说:"ORA-00918:列模糊定义".
解决这个问题的最佳方法是什么?
我得到了经典错误"ORA-00918:列模糊定义",通常我知道如何解决它,但我现在的问题是我正在使用700行查询.有没有办法识别列?
Thx Daniele
我正在运行以下代码:
Criteria crit = dao.getSesion().createCriteria(TAmbitos.class);
crit.add( Restrictions.sqlRestriction("translate(upper(nombre), 'ÁÉÍÓÚ', 'AEIOU') like translate(upper(?),'ÁÉÍÓÚ', 'AEIOU')",
param+"%", Hibernate.STRING));
crit.add(Restrictions.eq("tipoAmbito", "Empresa"));
crit.setFetchMode("TAmbitosByPais", FetchMode.JOIN);
crit.createAlias("TAmbitosByPais", "TAmbitosByPais", CriteriaSpecification.LEFT_JOIN);
crit.add(Restrictions.eq("TAmbitosByPais", ambito));
Run Code Online (Sandbox Code Playgroud)
这导致ORA-00918: column ambiguously defined异常.该条件有一个表TAmbitos引用自身TAmbitosByPais(任何给定的TAmbitos行都有一个TAmbitosByIdPais引用另一个的字段TAmbitos).生成的SQL是:
SELECT this_.id_ambito AS id1_2_1_, this_.depende_empresa AS depende2_2_1_,
this_.id_zona AS id3_2_1_, this_.pais AS pais2_1_,
this_.id_cls_soc AS id5_2_1_, this_.tipo_ambito AS tipo6_2_1_,
this_.nombre AS nombre2_1_, this_.clave_antigua AS clave8_2_1_,
this_.desactivado AS desactiv9_2_1_,
tambitosby1_.id_ambito AS id1_2_0_,
tambitosby1_.depende_empresa AS depende2_2_0_,
tambitosby1_.id_zona AS id3_2_0_, tambitosby1_.pais AS pais2_0_,
tambitosby1_.id_cls_soc …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用单个语句执行多个插入来实现此目的,我正在使用 Insert into select 语句。但是我面临着当两列在插入中具有相同的值时。我收到的错误消息是ORA-00918: column ambiguously defined.
询问
INSERT INTO sample (
HOST,
TOTAL_PING,
TOTAL_UNAVAILABLE_PING
)
SELECT * FROM (
SELECT 'FR3158-73-1',
82,
82
FROM DUAL
UNION ALL
SELECT 'FR3158-76-2',
80,
10
FROM DUAL
)
Run Code Online (Sandbox Code Playgroud)
如果我将一个值更改为有效的值,则第一个 select 语句中存在两个值是 82 和 82 的问题。即使列值相同,我也不知道如何进行这项工作。
- - 更新 - -
表定义
CREATE TABLE sample
(
ID NUMBER GENERATED ALWAYS as IDENTITY(START with 1 INCREMENT by 1) PRIMARY KEY,
HOST VARCHAR2(15 BYTE),
TOTAL_PING INTEGER,
TOTAL_UNAVAILABLE_PING INTEGER,
ADDED_ON TIMESTAMP(6) DEFAULT systimestamp
);
Run Code Online (Sandbox Code Playgroud) 两个Subselects运行良好独立.
但我希望加入他们,他们总是给出"ORA-00918:列模糊定义".我不明白为什么?
两个子选项都使用其他名称.
SELECT *
FROM (SELECT aods.user_id,
aods.firstname,
aods.lastname,
Aods.DEPARTMENT,
cods.jc_name
FROM personas aods
LEFT JOIN
user_jc cods
ON aods.user_id = cods.user_id
WHERE cods.jc_name LIKE '%ADM%') ods
FULL OUTER JOIN
(SELECT abl.user_id,
abl.firstname,
abl.lastname,
Abl.DEPARTMENT,
bbl.ug_name
FROM personas abl
LEFT JOIN
ru_ug bbl
ON abl.user_id = bbl.user_id
WHERE Bbl.UG_NAME LIKE '%ADM%'
AND bbl.rss_name = 'TIR') bl
ON ods.user_id = bl.user_id
Run Code Online (Sandbox Code Playgroud)