2016-09-21 8 views
0

内部クエリ私は内側のクエリに関する疑問を持っている問題

スキーマ:

  • DEPARTMENTDEPTNUM、DESCRIP、instnameの、DEPTNAME、状態、郵便番号)
  • ACADEMICacnum 、deptnum *、famname、givename、イニシャル、タイトル)
  • PAPERpanum、タイトル)
  • AUTHORパナム、acnum **)
  • FIELDfieldnum、ID、タイトル)
  • INTERESTfieldnum、acnum **、DESCRIP)

私はこの形式の出力を持っています:

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

Group byは、選択列リストと同じ列をすべて含める必要がありますか? –

+0

@JaydipJ Questionerのグループは、常にacnumにあり、これは学問のテーブルのユニークなキーのようです。 – ebyrob

+0

@ebyrob集約していない列をすべて含めないとエラーになります。あなたは 'GROUP BY a.acnum、a.title、a.givename、a.famname'を必要とします。 – Eric

関連する問題