[英]Cannot select a column from a subquery
我做了我需要的查询,但是我只需要从结果中选择一列。 所以它是这样的:
select SWDATECREATED from
(select * from MBR_INST_PRODUCTS
inner join MBR_SUBSCRIBERS
on MBR_INST_PRODUCTS.SWOBJECTID = MBR_SUBSCRIBERS.SWSUBRID
where MBR_SUBSCRIBERS.SWSUBRID = 54501928
and SWINSTPRODID = 1433193947);
如果我在方括号内运行select,那就很好。 但是,如果我尝试从该结果集中仅选择特定列,则会收到错误ORA-00904。 我已经检查了错误,但所有列均已正确写入。 如何从选择中仅选择SWDATECREATED?
这是我的错误:
ORA-00904:“ SWDATECREATED”:无效的标识符00904。00000-“%s:无效的标识符” *原因:
*操作:第5行错误:8列
感谢您的时间。
基本上,您会遇到这样的情况,即两个表中的列名都相同(尽管可能您的列数比这还多):
create table MBR_INST_PRODUCTS (SWINSTPRODID, SWOBJECTID, SWDATECREATED) as
select 1433193947, 54501928, date '2018-01-01' from dual;
create table MBR_SUBSCRIBERS (SWSUBRID, SWDATECREATED) as
select 54501928, date '2018-02-28' from dual;
select * from MBR_INST_PRODUCTS
inner join MBR_SUBSCRIBERS
on MBR_INST_PRODUCTS.SWOBJECTID = MBR_SUBSCRIBERS.SWSUBRID
where MBR_SUBSCRIBERS.SWSUBRID = 54501928
and SWINSTPRODID = 1433193947;
SWINSTPRODID SWOBJECTID SWDATECREATED SWSUBRID SWDATECREATED
------------ ---------- ------------------- ---------- -------------------
1433193947 54501928 2018-01-01 00:00:00 54501928 2018-02-28 00:00:00
在结果集中,您拥有两个表中的所有列,包括具有相同名称的列。 客户端(在本例中为SQL Developer)正在显示原始列名,但有些可能会将其更改为唯一。
当您尝试使用该查询作为内联视图时,名称必须是唯一的,Oracle会在内部隐式添加一些内容以使其唯一。 决定什么或如何决定并不重要。 当你做
select SWDATECREATED from ( .. that query ... )
现在,内联视图中这两列的内部名称都与您希望看到的名称不匹配,因此得到ORA-00904。 内联视图中不存在该标识符。
您不需要子查询来仅获得该列,但是您必须指定想要的两列中的哪一列-否则您将获得ORA-00918,因为Oracle无法猜测您的意思是:
select MBR_INST_PRODUCTS.SWDATECREATED from MBR_INST_PRODUCTS
inner join MBR_SUBSCRIBERS
on MBR_INST_PRODUCTS.SWOBJECTID = MBR_SUBSCRIBERS.SWSUBRID
where MBR_SUBSCRIBERS.SWSUBRID = 54501928
and SWINSTPRODID = 1433193947;
SWDATECREATED
-------------------
2018-01-01 00:00:00
select MBR_SUBSCRIBERS.SWDATECREATED from MBR_INST_PRODUCTS
inner join MBR_SUBSCRIBERS
on MBR_INST_PRODUCTS.SWOBJECTID = MBR_SUBSCRIBERS.SWSUBRID
where MBR_SUBSCRIBERS.SWSUBRID = 54501928
and SWINSTPRODID = 1433193947;
SWDATECREATED
-------------------
2018-02-28 00:00:00
如果您还有其他原因要使用子查询,则需要以相同的方式指定要从哪个表中获取该列,或者可以选择包括其他列; 或同时包含这两列,但为其赋予唯一的别名。 然后,您将能够在外部查询中引用别名。
使用*
常常被认为是不好的做法,尤其是在子查询中,部分原因是它可能导致不必要的工作,部分原因是代码运行之间的表更改可能使您不满意,部分原因是它可能导致这种情况。混乱。
最好显式命名所需的列。 并且为所有列加上它们来自的表(或表别名)的前缀(即使它们是唯一的),因此您和任何需要维护代码的人都可以更轻松地遵循它; 我不得不猜测将SWINSTPRODID
列放入哪个表。它也更安全-以防万一稍后将新列添加到表中使其不唯一。
您只应在查询中将其用作列名:
select SWDATECREATED from MBR_INST_PRODUCTS
inner join MBR_SUBSCRIBERS
on MBR_INST_PRODUCTS.SWOBJECTID = MBR_SUBSCRIBERS.SWSUBRID
where MBR_SUBSCRIBERS.SWSUBRID = 54501928
and SWINSTPRODID = 1433193947;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.