从包含所有另一个表的表中进行选择

时间:2018-02-12 00:18:16

标签: sql oracle-sqldeveloper

假设我有三张桌子:

Employees:
       PID NAME                       WAGE
---------- -------------------- ----------
     10234 Able                          8
     11567 Baker                         9
      3289 George                       10
     88331 Alice                        11

Employee_made:
       PID        SID   QUANTITY      HOURS
---------- ---------- ---------- ----------
     10234         11         24          3
     10234         12          6          1
     10234         13         24          1
     10234         21          6          1
     10234         23          4          1
     10234         31         48          6
     11567         23          4          1
     11567         31          1          1
     88331         11          6          1

Sandwich:
       SID      PRICE NAME                         
---------- ---------- ------------------------------
        12          2 hamburger on wheat            
        13          2 cheese burger                 
        21       1.75 fish burger on rye            
        23       1.75 fish burger on wheat          
        31          3 veggie burger on wheat        
        11          2 hamburger on rye  

我需要列出制作了所有不同三明治的所有员工,并显示他们的名字和PID。到目前为止我得到的是:

Select E.name, E.pid 
From employees E, employee_made EM, sandwich S
Where E.pid = EM.pid

它告诉我来自employees和employee_made表的匹配PID。在我不确定的地方是如何显示已经制作了所有三明治的员工,因此不将任何SID与employee_made表匹配,而是将所有SID与所有这些匹配。

1 个答案:

答案 0 :(得分:2)

首先,从不FROM子句中使用逗号。 始终使用正确的JOIN语法。

您可以通过计算员工制作的三明治数量然后与三明治总数进行比较来解决这个问题:

select em.pid
from employee_made em 
group by em.pid
having count(distinct em.sid) = (select count(*) from sandwich);

这给出了员工的pid。我会告诉你如何引入员工姓名(提示:inexistsjoin都可以使用。