[英]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.