MYSQL选择删除指定的两次
将“选择”更改为“删除”时出现问题:MYSQL选择删除指定的两次,mysql,sql,Mysql,Sql,将“选择”更改为“删除”时出现问题: DELETE FROM mitarbeiter WHERE mitarbeiter.pers_nr= (SELECT mitarbeiter.pers_nr FROM mitarbeiter LEFT JOIN kunde ON kunde.betreuer=mitarbeiter.pers_nr group by mitarbeiter.pers_nr order by count(*) limit 1); 错误是说 表“mitarbeiter”被指定了
DELETE
FROM mitarbeiter
WHERE mitarbeiter.pers_nr=
(SELECT mitarbeiter.pers_nr
FROM mitarbeiter
LEFT JOIN kunde ON kunde.betreuer=mitarbeiter.pers_nr
group by mitarbeiter.pers_nr
order by count(*)
limit 1);
错误是说
表“mitarbeiter”被指定了两次,既作为“DELETE”的目标,也作为单独的数据源
如何更改它?您可以用连接替换逻辑:
也就是说,逻辑可能可以简化,但很奇怪。将COUNT*与左联接一起使用,因此即使第二个表中的非匹配项也会得到1的计数。通过示例数据和期望的结果了解您的意图,将有助于其他人了解另一种方法是否更有效。您可以尝试使用基于联接的表作为同一子查询的别名,而不是使用where和subquery
DELETE m.*
FROM mitarbeiter m
INNER JOIN (
SELECT mitarbeiter.pers_nr
FROM mitarbeiter
LEFT JOIN kunde ON kunde.betreuer=mitarbeiter.pers_nr
group by mitarbeiter.pers_nr
order by count(*)
limit 1
) t ON t.pers_nr = m.pers_nr
您可以尝试的另一种解决方法是将子查询保存在临时表中,然后调用该表中的行
DROP TABLE IF EXISTS tempTable;
CREATE TEMPORARY TABLE tempTable
SELECT mitarbeiter.pers_nr
FROM mitarbeiter
LEFT JOIN kunde
ON kunde.betreuer=mitarbeiter.pers_nr
GROUP BY mitarbeiter.pers_nr
ORDER BY COUNT(*)
LIMIT 1;
DELETE FROM mitarbeiter
WHERE mitarbeiter.pers_nr
IN (
SELECT * FROM tempTable
);
DROP TABLE tempTable; -- cleanup
警告:与在其他解决方案中使用JOIN相比,这可能需要更长的时间和/或更大的空间。欢迎使用堆栈溢出!这是否有助于为您指明正确的方向 我经常发现,当我使用时,结果可视化对我虚弱的大脑更容易 请注意,8.0版之前的MySQL
请解释您试图执行的操作。我想删除结果集。任务是解雇/删除kunde=客户数量最少的员工=mitarbeiter您的建议是什么?我对SQL完全是新手任务是解雇员工=mitarbeiter,客户数量最少=kunde
DROP TABLE IF EXISTS tempTable;
CREATE TEMPORARY TABLE tempTable
SELECT mitarbeiter.pers_nr
FROM mitarbeiter
LEFT JOIN kunde
ON kunde.betreuer=mitarbeiter.pers_nr
GROUP BY mitarbeiter.pers_nr
ORDER BY COUNT(*)
LIMIT 1;
DELETE FROM mitarbeiter
WHERE mitarbeiter.pers_nr
IN (
SELECT * FROM tempTable
);
DROP TABLE tempTable; -- cleanup
CREATE TABLE IF NOT EXISTS mitarbeiter (
pers_nr varchar(10),
PRIMARY KEY (pers_nr)
) DEFAULT CHARSET=utf8;
INSERT INTO mitarbeiter (pers_nr) VALUES
('Scum'),
('Worker'),
('Manager'),
('President');
CREATE TABLE IF NOT EXISTS kunde (
kunde_id int(3) NOT NULL,
betreuer varchar(10) NOT NULL,
PRIMARY KEY (kunde_id)
) DEFAULT CHARSET=utf8;
INSERT INTO kunde (kunde_id, betreuer) VALUES
(1, 'Scum'),
(2, 'Worker'),
(3, 'Worker'),
(4, 'Manager'),
(5, 'Manager'),
(6, 'Manager'),
(7, 'President'),
(8, 'President'),
(9, 'President'),
(10, 'President');
WITH s1
AS
(SELECT betreuer
, count(1) AS kunde_count_by_pers_nr -- JJAUSSI: find the kunde count by pers_nr
FROM kunde
GROUP BY betreuer
),
s2
AS
(SELECT MIN(kunde_count_by_pers_nr) AS kunde_count_by_pers_nr_min -- JJAUSSI: find the lowest kunde_count
FROM s1),
s3
AS
(SELECT s1.betreuer
FROM s1 INNER JOIN s2
ON s1.kunde_count_by_pers_nr = s2.kunde_count_by_pers_nr_min -- JJAUSSI: Retrieve all the betreuer values with the lowest kunde_count
)
SELECT * -- JJAUSSI: Test this result and see if it contains the records you expect to delete
FROM s3;
--DELETE -- JJAUSSI: Once you are confident in the results from s3, this DELETE can work
-- FROM mitarbeiter
-- WHERE pers_nr IN (SELECT betreuer
-- FROM s3);
SELECT * -- JJAUSSI: Check for the desired results (we successfully got rid of 'Scum'!)
FROM mitarbeiter;