2016-10-12 1 views
1

Entschuldigung, ich hoffe, ich habe dies an der richtigen Stelle, aber ich habe nur ein paar Fragen zu meiner Datenbank, die ich nicht herausfinden kann, warum meine Abfragen nicht funktionieren.Oracle SQL Query 2

Meine Datenbankrelation Schema ist wie folgt:

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) ich finden müssen, wenn es mehr Akademiker sind, die weniger als 20 Papiere geschrieben haben. Ich muss die Acnum, den Titel, den Famnamen, die gegebene Nummer und die Anzahl der Papiere, die sie geschrieben haben, auflisten. Siehe meinen Versuch unter:

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) Ich muß auch mit der größten Anzahl von Wissenschaftlern, die Abteilungen finden und drucken ihre DEPTNUM, deptname und InstName, aber im einen Syntaxfehler zu bekommen. Siehe mein Versuch:

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

Wenn ich verstehe Ihr Schema richtig beseitigen müssen, sollte es keine Duplikate in die "Autor" -Tabelle (eine bestimmte akademische t als Autor eines bestimmten Papiers mehr als einmal angezeigt werden). Wenn dies der Fall ist, brauchen Sie in der ersten Abfrage nur einen Join zwischen "akademisch" und "Autor" - Sie müssen sich nicht der Tabelle "Papier" anschließen. – mathguy

Antwort

0

Ihre Joins müssen sein, damit sie laden.

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; 

ein ORDER BY Verwenden Sie die Top-Abteilung zu geben.

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

Danke dafür, trotzdem bekomme ich einen Syntaxfehler: Fehlendes Schlüsselwort. Irgendwelche Ideen? –

+0

@ B.Straat jetzt versuchen – Matt

+0

Die zweite Abfrage wird immer noch alle Abteilungen, nicht nur die eine (oder zwei oder drei ...) mit der größten Anzahl von Akademikern zurückgeben. – mathguy

2

ein Paar (panum, acnum) in author mehr nicht angezeigt Unter der Annahme, als einmal (es gibt keine Duplikate in dieser Tabelle), brauchen Sie nicht zu paper in der ersten Abfrage zu verbinden. Dies sollte ausreichen:

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; 

Der Fehler in Ihrem ursprünglichen Versuch die Reihenfolge der on Bedingungen war; Der erste innere Join muss SOFORT durch seinen entsprechenden on Zustand befolgt werden, Sie können ihn nicht für später verlassen. Wie ich gerade gezeigt habe, benötigen Sie nur einen Join.

Für die zweite Abfrage müssen Sie zuerst die Abteilung (en) mit der maximalen Anzahl an Akademikern finden, die die Tabelle academic verwenden. Dann können Sie das Ergebnis der Tabelle department beitreten.

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

Sind Sie Duplikate oder seine

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; 

und

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; 

oder

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

Die zweite Abfrage wird funktionieren, aber es werden "Verbindungen" fehlen (Fälle, in denen zwei oder drei Abteilungen für die größte Anzahl von Akademikern gebunden sein können). – mathguy

+0

Vielen Dank für Ihren Punkt. Ich füge Code mit dichtem_rank hinzu, um es zu reparieren –