2016-10-12 17 views
1

申し訳ありませんが、私はこれを適切な場所に置いてもらいたいと思いますが、質問が2つあります。Oracle SQL Query 2

次のように私のデータベースリレーションスキーマは次のとおりです。

DEPARTMENT(deptnum, descrip, instname, deptname, state, postcode) 
ACADEMIC(acnum, deptnum*, famname, givename, initials, title) 
PAPER(panum, d.) 
AUTHOR(panum*, acnum*) 
FIELD(fieldnum, id, title) 
INTEREST(fieldnum*, acnum*, descrip) 

1)私は20本の未満の論文を書かれている任意のより多くの学者があるかどう見つける必要があります。私はacnum、タイトル、famname、指定された論文の数と彼らが書いた数をリストする必要があります。私はまた、学者の数が最も多い部署を見つけて、そのDEPTNUM、DEPTNAMEとinstnameのを印刷する必要がありますが、イムは、構文エラーを取得)

SELECT a.acnum, a.title, a.famname, a.givename, count(p.panum) 
FROM ACADEMIC a 
    INNER JOIN PAPER p 
    INNER JOIN AUTHOR au ON a.acnum = au.acnum and au.panum = p.panum 
GROUP BY a.ACNUM, a.title, a.famname, a.givename 
HAVING COUNT(p.panum) < 20; 

2:以下の私の試みを参照してください。私の試行を見てください:

SELECT deptnum, deptname, instname, count(acnum) 
FROM department, academic, 
WHERE academic.deptnum = department.deptnum 
GROUP BY deptnum 
HAVING MAX(count(acnum)); 
+0

ています'author'テーブル(特定の学術的なshouldn '特定の論文の著者として複数回表示されることがあります)。その場合、最初のクエリでは、 'academic'と' author'の間に1回のjoinだけが必要です。 'paper'テーブルに参加する必要はありません。 – mathguy

答えて

0

あなたのジョイントはロードするために必要です。

SELECT a.acnum, a.title, a.famname, a.givename, COUNT(p.panum) 
FROM ACADEMIC a 
INNER JOIN AUTHOR au ON a.acnum = au.acnum 
INNER JOIN PAPER p ON au.panum = p.panum 
GROUP BY a.ACNUM, a.title, a.famname, a.givename 
HAVING COUNT(p.panum) < 20; 

あなたにトップ部門を与えることORDER BYを使用してください。ペア(panum, acnum)が何度もauthor以上に表示されていないと仮定すると、

SELECT d.deptnum, d.deptname, d.instname, COUNT(a.acnum) 
FROM department d 
INNER JOIN academic a d.deptnum = a.deptnum 
GROUP BY d.deptnum, d.deptname, d.instname 
ORDER BY COUNT(a.acnum); 
+0

ありがとう、私はまだ構文エラーが表示されます:キーワードがありません。何か案は? –

+0

@ B.Straat try now – Matt

+0

2番目のクエリは、学者が最も多い1つ(または2つまたは3つ)だけでなく、すべての部門を返します。 – mathguy

2

(そのテーブルの重複しない)には、最初のクエリでpaperに参加する必要はありません。これで十分です:

SELECT a.acnum, a.title, a.famname, a.givename, count(au.panum) as ct 
FROM ACADEMIC a 
    INNER JOIN AUTHOR au ON a.acnum = au.acnum 
GROUP BY a.ACNUM, a.title, a.famname, a.givename 
HAVING COUNT(au.panum) < 20; 

を元の試みでエラーがon条件の順でした。最初の内部結合には、それに対応するon条件が即座に従わなければなりません。後でそれを残すことはできません。しかし、私が示したように、あなたは1回の参加が必要です。

2番目のクエリでは、academicテーブルを使用して、学者の数が最大の部署を最初に探す必要があります。結果をdepartmentテーブルに結合することができます。

select d.deptnum, d.deptname, d.instname, m.ct 
from department d inner join 
     (select deptnum, count(acnum) as ct 
     from  academic 
     group by deptnum 
     having count(acnum) = (select max(acnum) from academic group by deptnum) 
     ) m 
      on d.deptnum = m.deptnum 
; 
0

私が正しくあなたのスキーマを理解していれば、には重複があってはならないあなたの重複を排除する必要があるか、その

SELECT a.acnum, a.title, a.famname, a.givename, count(au.panum) 
FROM ACADEMIC a 
JOIN AUTHOR au ON a.acnum = au.acnum 
GROUP BY a.ACNUM, a.title, a.famname, a.givename 
HAVING COUNT(au.panum) < 20; 

SELECT deptnum, deptname, instname, count_ac 
FROM (
    SELECT d.deptnum, d.deptname, d.instname, COUNT(a.acnum) as COUNT_AC 
    FROM department d 
    JOIN academic a d.deptnum = a.deptnum 
    GROUP BY d.deptnum, d.deptname, d.instname 
    ORDER BY COUNT(a.acnum) 
) WHERE ROWNUM < 2; 

または

SELECT deptnum, deptname, instname, count_ac 
FROM (
    SELECT d.deptnum, d.deptname, d.instname, dense_rank() over (order by COUNT(a.acnum) desc) cur_rank, COUNT(a.acnum) as count_ac 
    FROM department d 
    JOIN academic a d.deptnum = a.deptnum 
    GROUP BY d.deptnum, d.deptname, d.instname 
) WHERE cur_rank = 1; 
+0

2番目のクエリは機能しますが、最大の数の学者のために2つまたは3つの部門が結ばれている場合は、「ネクタイ」がありません。 – mathguy

+0

ありがとうございます。それを修正するためにdense_rankでコードを追加する –