【问题标题】:DELETE projects where more than 2 employee involved删除超过 2 名员工参与的项目
【发布时间】:2016-09-20 07:54:09
【问题描述】:

我有以下架构:

员工(fname,lname,e_no,age,address,sex,slary,dept_number)

部门(部门名称、部门编号、部门位置)

项目(pname,pnumber,plocation,dept_number)

works_on(e_no,pnumber,hours)

我想删除涉及超过 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))

【问题讨论】:

  • 改用GROUP BY project.pnumber。 (不能直接搜索works_on吗?)
  • 查询没有被执行是什么意思?它会重新发出错误消息吗?如果是,那么究竟是什么?我的猜测是您无法从要删除行的表中进行选择。

标签: mysql sql


【解决方案1】:

您可以使用相关子查询:

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

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

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

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

【讨论】:

    【解决方案2】:
    DELETE FROM project
    WHERE project.pnumber IN (SELECT w.pnumber 
                              FROM works_on w
                              GROUP BY w.pnumber
                              HAVING COUNT(w.e_no) > 2))
    

    【讨论】:

      【解决方案3】:

      试试这个:

      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 子句中

      当你执行你的语句时得到的。

      【讨论】:

        【解决方案4】:

        您不能同时从要从中选择的表中删除。制作这样的临时表

        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
        )
        

        【讨论】:

          【解决方案5】:

          请尝试以下代码。它在 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
          )
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-06-25
            • 2017-06-13
            • 1970-01-01
            • 2010-12-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多