2017-12-04 3 views
0

ich eine relationale Abteilung Abfrage zu schreiben versuchen, (ich ist verpflichtet, für diesen Relational Abteilung zu verwenden) Gegeben die folgenden Tabellen:Oracle Relational Abteilung Abfrage

Gast:

GID  PHNUM FNAME   LNAME    CCNUM RESDATE                                       
    1654 3132565356 Tyrone   Biggums    8420 2016-11-04                   
    1743 2484352574 Noah   Colon     3345 2016-11-03                   
    1501 2487615478 Brennan   Luttrell    6426 2016-11-05 

Zimmer:

ROOMNUM ROOMTYPE   GID                              

    101 Suite   1654                              
    103 Suite                                  
    105 Suite   1743                              
    107 Suite                                  
    108 Double   1501                              
    115 Double   1654                              
    117 Double                                  
    130 Single   1501                              
    135 Single   1501 

Mitarbeiter:

SSN  SUPERSSN FNAME   LNAME    PHNUM  WAGE                              
123456789   Jim    Lahey   2464572367   40                
532674246 123456789 Geno   Bianco   2463601456   15                
837264268 123456789 Randy   Bobandy   2463603678   10                 
738643653 837264268 Corey   Trevor   2464326734   7                 
648753674 837264268 Joshua   Trussler  2464327535   8 

Behält:

EMPLOYEES ROOMNUM                                                                
648753674  101                                 
648753674  115                                 
738643653  101                                 
738643653  105                                 
738643653  108                                 
738643653  130                                 
738643653  135                                 
837264268  107  

Ich versuche, eine Abfrage zu schreiben, die relationale Division verwenden würde jeden Mitarbeiter auszuwählen, die jedes Zimmer von einem Gast, dessen GID = 1654

Die Abfrage, die ich geschrieben habe vorbehalten reinigt ist wie folgt:

SELECT E.ssn, E.lname, E.fname 
FROM employee E 
WHERE NOT EXISTS((SELECT G.gid 
        FROM guest G 
        WHERE G.gid = 1654) 
        MINUS 
        (SELECT G.gid 
        FROM maintains M, room R, guest G 
        WHERE G.gid = R.gid 
        AND R.roomnum = M.roomnum 
        AND E.ssn = M.employeessn 
        AND G.gid = 1654)); 

jedoch in seiner derzeitigen Form gibt es die folgende, die nicht korrekt ist:

SSN  LNAME   FNAME                                                         
738643653 Trevor   Corey                              
648753674 Trussler  Joshua  

Alle und alle Hilfe ist dankbar, danke.

+0

„[Divided We Stand: Das SQL der Relationalen Abteilung] (https://www.red-gate.com/simple-talk/sql/t-sql-progra mming/dived-we-stand-the-sql-of-relational-division /) "von Joe Celko ist ein Standardartikel über relationale Teilung. –

+0

Was war Ihre Begründung für diese Abfrage? Für welche Abteilung halten Sie das? – philipxy

Antwort

0

Sie könnten alle Zimmer und Räume durch Mitarbeiter gepflegt zählen und nur die Zeilen mit gleichen Werten annehmen:

select distinct ssn, fname, lname 
    from (select e.ssn, e.fname, e.lname, 
       count(distinct r.roomnum) over() cnt_room, 
       count(1) over (partition by e.ssn) cnt_ssn 
      from room r 
      join maintains m on m.roomnum = r.roomnum 
      join employee e on e.ssn = m.employeessn 
      where gid = 1654) 
    where cnt_room = cnt_ssn 

SQL Fiddle Demo

Ergebnis:

 SSN FNAME LNAME 
---------- ------ -------- 
648753674 Joshua Trussler