簡體   English   中英

無法從子查詢中選擇列

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM