2016-04-07 6 views
0

enter image description hereSQL, verbinden sie Inner Ausgabe in oracle

^HOSPITAL_SPECIALISE_TEST^

enter image description here ^ HOSPITAL^

Hier meine 2 Tische sind. Ich versuche, inneren zu verwenden join um ein Ergebnis zu erzeugen, und das ist die Abfrage, die ich zur Zeit verwenden:

SELECT HOSPITAL_ID, COUNT(DISTINCT SPECIALISE) AS SPECIALISE FROM HOSPITAL_SPECIALISE_TEST GROUP BY HOSPITAL_ID; 

Und ich bekomme das Ergebnis unter ...

enter image description here

Jetzt ist hier die Frage, ich beiden Tabellen und Anzeige Krankenhaus Namen anschließen möchte, aber es funktioniert nicht zu generieren, und ich weiß nicht, warum ... Hier ist meine Frage:

SELECT HS.HOSPITAL_ID, HP.NAME, COUNT(DISTINCT HS.SPECIALISE) AS SPECIALISE 
FROM HOSPITAL_SPECIALISE_TEST HS 
INNER JOIN HOSPITAL HP 
on HS.HOSPITAL_ID = HP.HOSPITAL_ID 
GROUP BY HOSPITAL_ID; 
+1

"aber es erzeugt nicht" ist eine schwache Beschreibung dessen, was passiert. Sie sollten stattdessen den Oracle-Fehler angeben ("ORA-00979 kein GROUP BY-Ausdruck"). –

Antwort

1

D o dieser Stelle

SELECT HP.NAME, spec.hospital_id, spec.specialise 
FROM ( SELECT HOSPITAL_ID, COUNT (DISTINCT SPECIALISE) AS SPECIALISE 
     FROM HOSPITAL_SPECIALISE_TEST 
    GROUP BY HOSPITAL_ID) spec 
    INNER JOIN HOSPITAL HP ON spec.HOSPITAL_ID = HP.HOSPITAL_ID 
0

Die Gruppe muss alle Spalten auswählen (außer dem Aggregat) enthalten:

GROUP BY HS.HOSPITAL_ID, HP.NAME.

1

Obwohl der Krankenhausname eindeutig aus der Krankenhaus-ID abgeleitet werden kann, nach der Sie gruppieren, fordert Oracle, dass sie entweder ebenfalls in die GROUP by-Klausel aufgenommen oder aggregiert werden soll. Dies führt zu einem dieser eher plump Anfragen:

select hs.hospital_id, hp.name, count(distinct hs.specialise) as specialise 
from hospital_specialise_test hs 
inner join hospital hp on hs.hospital_id = hp.hospital_id 
group by hs.hospital_id, hp.name; 

oder

select hs.hospital_id, max(hp.name) as name, count(distinct hs.specialise) as specialise 
from hospital_specialise_test hs 
inner join hospital hp on hs.hospital_id = hp.hospital_id 
group by hs.hospital_id; 

Dies ist kompatibel mit dem alten Standard 92 SQL, aber nicht mit neueren Versionen der SQL-Standards, die Ihre Anfrage gerne annehmen würden :-)

können Sie das Problem umgehen, indem sie nicht die Tabellen verknüpft:

select 
    hs.hospital_id, 
    (select name from hospital hp where hs.hospital_id = hp.hospital_id) as name, 
    count(distinct hs.specialise) as specialise 
from hospital_specialise_test hs 
group by hospital_id, hp.name; 

oder durch Verknüpfen von voraggregierten Datensätzen, wie von cableload vorgeschlagen.