删除涉及2名以上员工的项目

时间:2016-05-23 12:21:39

标签: mysql sql

我有以下架构:

  

雇员(FNAME,L-NAME,e_no,年龄,地址,性别,slary,dept_number)

     

dpartment(DEPT_NAME,dept_number,dept_location)

     

项目(PNAME,pnumber,plocation,dept_number)

     

works_on(e_no,pnumber,小时)

我想删除涉及2名以上员工的项目。为此我做了以下查询。

但它没有被执行。我如何解决此问题?

 DELETE FROM project
 WHERE project.pnumber IN (SELECT project.pnumber 
                           FROM project
                             JOIN works_on ON project.pnumber = works_on.pnumber
                           GROUP BY project.pname
                           HAVING COUNT(works_on.e_no) > 2))

5 个答案:

答案 0 :(得分:1)

您可以使用相关子查询:

DELETE p FROM project p
    WHERE (SELECT COUNT(*) FROM works_on w WHERE w.pnumber = p.pnumber) > 2;

我喜欢这种方法有几个原因。

首先,它可以利用works_on(pnumber)上的索引。其次,它绕过一个大文件排序。我认为MySQL甚至可以使用索引运行聚合。

此外,如果还有其他条件 - 例如过去一年中创建的项目 - 那么相关子查询可能会更有效率,因为聚合只需要在匹配的项目上运行。

答案 1 :(得分:0)

DELETE FROM project
WHERE project.pnumber IN (SELECT w.pnumber 
                          FROM works_on w
                          GROUP BY w.pnumber
                          HAVING COUNT(w.e_no) > 2))

答案 2 :(得分:0)

试试这个:

DELETE FROM project
 WHERE project.pnumber IN (
   SELECT pnumber
   FROM (
     SELECT project.pnumber 
     FROM project JOIN works_on 
     ON project.pnumber=works_on.pnumber
     GROUP BY project.pname
     HAVING COUNT(works_on.e_no) > 2) as t
)

使用这个技巧可以避免错误:

  

错误代码:1093。您无法指定目标表'项目'更新   在FROM子句中

执行你的陈述时得到的。

答案 3 :(得分:0)

您无法同时从正在选择的表格中删除。制作一个像这样的临时表

DELETE FROM project
WHERE project.pnumber IN 
(
   select * from
   (
      SELECT project.pnumber 
      FROM project
      JOIN works_on ON project.pnumber = works_on.pnumber
      GROUP BY project.pname
      HAVING COUNT(works_on.e_no) > 2)
   ) tmp
)

答案 4 :(得分:0)

请尝试以下代码。它在SQL Server 201中运行良好。

DECLARE @project TABLE (pname char(10),pnumber int,plocation char(10),dept_number int)
DECLARE @works_on TABLE (e_no int,pnumber int ,hours int)

INSERT INTO @project
(pname,pnumber,plocation,dept_number)
VALUES
('DB',1,'NY',5),
('CK',2,'NY',5),
('SB',3,'NY',5)

INSERT INTO @works_on
(e_no,pnumber,hours)
VALUES
(1,1,3),
(2,1,5),
(3,2,5),
(4,3,5),
(5,1,5)

DELETE FROM @project WHERE pnumber IN
    (
    SELECT wo.pnumber FROM @works_on wo
    GROUP BY wo.pnumber
    HAVING count(wo.pnumber)>1
)