我有以下架构:
雇员(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))
答案 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
)