2016-05-23 14 views
0

DELETE项目,我有以下模式:有超过2员工参与

employee(fname,lname,e_no,age,address,sex,slary,dept_number)

dpartment(dept_name,dept_number,dept_location)

project(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)) 
+2

尝试用'GROUP BY project.pnumber'代替。 (难道你不能直接搜索works_on吗?) – jarlh

+0

保持不变 –

+0

这是什么意思,查询没有得到执行?它是否会导致错误信息?如果是,那究竟是什么?我的猜测是,您无法从正在删除行的表中进行选择。 – Shadow

回答

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

使用这一招你规避错误:

Error Code: 1093. You can't specify target table 'project' for update in FROM clause

,当你执行你的发言你。

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

一个临时表可以使用相关子查询:

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

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

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

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

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 
)