2016-09-21 49 views
0

我有一個關於內部查詢疑問內部查詢問題

模式:

  • DEPARTMENTdeptnum,記述,instname,則將DEPTNAME,州,郵編)
  • ACADEMICacnum ,deptnum *,famname,givename,首字母縮寫,標題)
  • PAPERpanum,標題)
  • AUTHORpanum,acnum **)
  • FIELDfieldnum,ID,標題)
  • INTERESTfieldnum,acnum **,記述)

我有這種格式的輸出:

select 
    acnum, title, givename, famname 
from 
    academic a 
where 
    a.acnum in (select count(*) as no_of_papers, acnum 
       from author auth 
       join paper p on auth.panum = p.panum 
       group by acnum 
       having count(*) < 20) 
union 
select 
    acnum, title, givename, famname 
from 
    academic a 
where 
    a.acnum not in (select count(*) as no_of_papers, acnum 
        from author auth 
        join paper p on auth.panum = p.panum 
        group by acnum); 

但是,除了外部查詢的select語句中的字段外,我還希望在結果集中使用count(*)作爲no_of_papers

我已經打破了我的頭很長一段時間了。

+0

爲什麼不'join'到內部查詢,而不是使用它一個'where'子句? – bouncyball

+0

哪個RDBMS是爲了這個?請添加一個標籤來指定您是使用'mysql','postgresql','sql-server','oracle'還是'db2' - 或者其他的東西。 –

回答

0

使用Join

嘗試像這樣

SELECT acnum,title,givename,famname,no_of_papers 
FROM academic a JOIN 
( 
    SELECT COUNT(*) AS no_of_papers,acnum 
    FROM author auth JOIN paper p ON auth.panum=p.panum 
    GROUP BY acnum HAVING COUNT(*)<20 

)x ON 1 = 1 
WHERE a.acnum IN (x.acnum) 

UNION 

SELECT acnum,title,givename,famname,no_of_papers 
FROM academic a 
(
    SELECT COUNT(*) AS no_of_papers,acnum 
    FROM author auth JOIN paper p ON auth.panum=p.panum 
    GROUP BY acnum 

)y ON 1=1 
WHERE a.acnum NOT IN (y.acnum) 
+0

爲什麼在「a.acnum = x.acnum」這個「混淆」連接而不是'join(...)x? –

0

我不認爲你需要一個聯盟:

select 
    a.acnum, 
    MIN(a.title), -- only 1 value anyways if acnum is a primary key 
    MIN(a.givename), 
    MIN(a.famname), 
    count(p.panum) as no_of_papers 
from academic a 
left join author auth on a.acnum = auth.acnum 
left join paper p on auth.panum = p.panum 
group by a.acnum 
having 1 = 1 -- ??? no_of_papers < 20 ??? 
; 
+0

分組應該包含與選擇列表相同的所有列嗎? –

+0

@JaydipJ發問者的小組總是在'acnum'上,這似乎是學者桌上唯一的關鍵。 – ebyrob

+0

@ebyrob如果不包含所有非聚合列,它將會出錯。你需要'GROUP BY a.acnum,a.title,a.givename,a.famname' – Eric