Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MYSQL选择删除指定的两次_Mysql_Sql - Fatal编程技术网

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;