2017-02-16 4 views
-4

, ich habe die folgenden Daten (Full Universe) in einer Oracle-DB TabelleOracle SQL - Finden Einzigartige Abteilung Liste

DEPT  MANAGER  STATUS 
FINANCE JOHN   OOO 
FINANCE JACK   OOO 
FINANCE STEVE   OOO 
MARKETING BARBER  WFH 
MARKETING ROBERT  WORK 
HR   KATHY   OOO 
HR   NEIL   OOO 

Die Anforderung ist es, alle Abteilungen, um zu sehen, wo alle Mitarbeiter OOO sind. Das erwartete Ergebnis ist FINANCE und HR.

+2

Das ist einfach ... Was hat Sie dazu gebracht, diese Frage an SO zu stellen. Was ist dein Problem und was hast du probiert? – XING

+0

Dies ist extrem einfach mit einer Reihe von Lösungen auf einer einfachen Suche. Bitte lesen Sie http://stackoverflow.com/help/how-to-ask und versuchen Sie zumindest selbst eine Lösung und teilen Sie dies als Teil der Antwort. – BriteSponge

+0

Ich verstehe, dass dies sehr einfach ist, und ich habe einige Möglichkeiten, dies zu erreichen. Ich wollte sehen, ob es einen SQL-Experten gibt, der eine Lösung bietet, die die beste Leistung bietet. Die Lösung, die ich habe, funktioniert nicht am besten, wenn Sie Millionen von Datensätzen haben, daher die Anfrage. – user5152640

Antwort

0
with Departments as (
     select 'FINANCE' 'DEPT' , 'JOHN' 'MANAGER' , 'OOO' 'STATUS'  union all 
     select 'FINANCE' , 'JACK' , 'OOO'  union all 
     select 'FINANCE' , 'STEVE' , 'OOO'  union all 
     select 'MARKETING', 'BARBER', 'WFH'  union all 
     select 'MARKETING', 'ROBERT', 'WORK'  union all 
     select 'HR'  , 'KATHY' , 'OOO'  union all 
     select 'HR'  , 'NEIL' , 'OOO'  
    ) 
Select DISTINCT DEPT from Departments where STATUS='OOO' 
+1

Nein. Das ist nicht korrekt. –

+0

Warum denkst du, dass es nicht korrekt ist? Das Ergebnis zeigt korrekte Daten. –

+0

@Javion. . . Ihre Abfrage erhält eine Liste der Abteilungen mit dem Status "000". Es wird keine Liste von Abteilungen angezeigt, die nur "000" haben. Leider enthalten die Testdaten keinen solchen Fall, obwohl dies die Frage ist, die das OP stellt. –

0

Sie müssen group by dept (das ist fast offensichtlich). Sie müssen nur die Gruppen beibehalten, in denen kein Mitarbeiter einen anderen Status als OOO hat. Diese Art von Bedingungen gehört auf Gruppenebene (im Gegensatz zu einzelnen Zeilenebenen) zu einer Klausel having. Sie müssen mit der Möglichkeit umgehen, dass der STATUS null sein kann. Und Sie können die bedingte Zählung in having verwenden.

with 
    inputs (dept, manager, status) as (
     select 'FINANCE' , 'JOHN' , 'OOO' from dual union all 
     select 'FINANCE' , 'JACK' , 'OOO' from dual union all 
     select 'FINANCE' , 'STEVE' , 'OOO' from dual union all 
     select 'MARKETING', 'BARBER', 'WFH' from dual union all 
     select 'MARKETING', 'ROBERT', 'WORK' from dual union all 
     select 'HR'  , 'KATHY' , 'OOO' from dual union all 
     select 'HR'  , 'NEIL' , 'OOO' from dual 
    ) 
-- end of test data (not part of the query); SQL query begins BELOW THIS LINE 
select dept 
from  inputs 
group by dept 
having count(case when status is null or status != 'OOO' then 1 end) = 0 
; 

DEPT 
------- 
HR 
FINANCE 
+0

Danke Mathguy. – user5152640

+1

Aber das dauerte ziemlich lange auf unserem Prod-Schema. versuchen Alternativ kann die folgende Liste: wählen dept von den Eingängen WHERE status = 'OOO' MINUS wählen dept von den Eingängen WHERE status = 'OOO' , die angeblich arbeitet aber immer noch Zeit in Anspruch nimmt!. – user5152640

+0

Der Grund dafür könnte sein, dass Sie keine richtigen Indizes haben. – GurV

0

Der einfachste Weg ist:

select dept 
from departments 
group by dept 
having min(status) = max(status) and min(status) = '000'; 

Diese etwas komplizierter ist, wenn statusNULL sein könnte.

Verwandte Themen