Oracle 关系除法查询

Posted

技术标签:

【中文标题】Oracle 关系除法查询【英文标题】:Oracle Relational Division Query 【发布时间】:2017-12-04 08:34:42 【问题描述】:

我正在尝试编写关系除法查询(我需要为此使用关系除法) 给定下表:

客人:

   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   

房间:

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  

员工:

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 

维护:

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

我正在尝试编写一个查询,该查询将使用关系除法来选择每个清洁由 GID = 1654 的客人预订的每个房间的员工

我写的查询如下:

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

但是,它以当前形式返回以下内容,这是不正确的:

SSN       LNAME           FNAME                                                                                                                                                                                                                                 
738643653 Trevor          Corey                                                                                                                       
648753674 Trussler        Joshua       

感谢您的任何帮助,谢谢。

【问题讨论】:

"Divided We Stand: The SQL of Relational Division" by Joe Celko 是一篇关于关系除法的标准文章。 您对该查询的理由是什么?你认为它代表什么部门? 【参考方案1】:

您可以计算员工维护的所有房间和房间,并且只取具有相同值的行:

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

结果:

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

【讨论】:

以上是关于Oracle 关系除法查询的主要内容,如果未能解决你的问题,请参考以下文章

SQL语句怎么表示除法运算?

oracle apex 奇怪的零除法问题

Oracle中计算除法——解决除数为零报错

oracle保留两位小数

SQL 查找具有共同成员的集合(关系除法)

SQL如何做除法