2016-09-21 2 views
0

ich einen Zweifel an einer inneren Abfrageinnere Abfrage Ausgabe

Schema haben:

  • DEPARTMENT (DEPTNUM, descrip, InstName, deptname, Bundesland, Postleitzahl)
  • ACADEMIC (acnum , deptnum *, famname, givename, Initialen, Titel)
  • PAPER (panum, Titel)
  • AUTHOR (Panum, acnum **)
  • FIELD (FeldNum, id, title)
  • INTEREST (FeldNum, acnum **, descrip)

Ich habe die Ausgabe in diesem Format:

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); 

Mit den Feldern in der SELECT-Anweisung der äußeren Abfragen möchte ich aber auch die count(*) als no_of_papers in der Ergebnismenge.

Ich habe mir schon seit einiger Zeit den Kopf gebrochen.

+0

Warum nicht 'join' an der inneren Abfrage, anstatt sie mit in eine 'Where'-Klausel? – bouncyball

+0

Für welches RDBMS ist das gedacht? Bitte fügen Sie ein Tag hinzu, um anzugeben, ob Sie 'mysql',' postgresql', 'sql-server',' oracle' oder 'db2' verwenden - oder etwas ganz anderes. –

Antwort

0

Verwenden Join

versuchen, wie diese

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

Warum dieser "verschleierte" Join und nicht "Join (...) x auf a.acnum = x.acnum"? –

0

Ich glaube nicht, müssen Sie eine Vereinigung:

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

Gruppieren nach sollte alle Spalten enthalten wie Spaltenliste auswählen? –

+0

@JaydipJ Die Gruppe von Fragenden war immer auf "acnum", was ein eindeutiger Schlüssel der akademischen Tabelle zu sein scheint. – ebyrob

+0

@ebyrob Es wird ein Fehler ausgegeben, wenn Sie nicht alle nicht aggregierten Spalten einschließen. Sie müssen 'GROUP BY a.acnum, a.title, a.givename, a.famname' – Eric