为什么这段代码在MySQL中运行良好,而在SQL Server中运行不好?
这是Leetcode中的一个问题: 基本上,这个问题要求删除重复的电子邮件,并保留具有最小索引的电子邮件 我的代码如下,我首先在SQLServer模式下运行它,它显示内部错误。但它已经通过了MySQL模式。为什么会发生这种情况?在本例中,它们之间是否存在语法差异?谢谢为什么这段代码在MySQL中运行良好,而在SQL Server中运行不好?,mysql,sql,sql-server,tsql,Mysql,Sql,Sql Server,Tsql,这是Leetcode中的一个问题: 基本上,这个问题要求删除重复的电子邮件,并保留具有最小索引的电子邮件 我的代码如下,我首先在SQLServer模式下运行它,它显示内部错误。但它已经通过了MySQL模式。为什么会发生这种情况?在本例中,它们之间是否存在语法差异?谢谢 delete from Person where Id not in ( select temp.minimum from (select min(Id) as minimum from Person group by Emai
delete from Person
where Id not in (
select temp.minimum from
(select min(Id) as minimum from Person group by Email) as temp
);
在SQL Server中,您使用行号为的CTE:
但是,您的原始查询版本也应该在SQL Server中工作。在我看来不错。或许
DELETE FROM Person
WHERE Id not in ( Select Id FROM
(SELECT Email,
MIN(Id) as Id, COUNT(*) as N
FROM Person
GROUP BY Email
HAVING COUNT(*) > 1) as temp
);
请确保自行运行内部SELECT,以查看它是否为相同的架构。我在sql server express 10.50.6560上尝试了此功能,它似乎可以工作
CREATE TABLE PERSON
(
ID INT NOT NULL
, EMAIL VARCHAR(1000)
)
ALTER TABLE PERSON
ADD CONSTRAINT PK_PERSON
PRIMARY KEY (ID)
INSERT INTO PERSON VALUES(1, 'AAAAA')
INSERT INTO PERSON VALUES(2, 'AAAAA')
INSERT INTO PERSON VALUES(3, 'BBBBB')
DROP TABLE PERSON
-你的问题
delete from Person
where Id not in (
select temp.minimum from
(select min(Id) as minimum from Person group by Email) as temp
);
它删除一行
希望能有帮助是的。SQL不是SQL——它可能是有史以来最不标准的语言。实际上,每个产品都有非常不同的方言。我认为MS SQL语法看起来还可以。它还检查SSMS中的所有OK。你有什么内部错误?可能只是leetcode上的一个问题side@60221611这个三重嵌套的查询非常糟糕——它强制进行一次完整的表扫描来计算GROUPBY和HAVING,然后进行另一次搜索,我希望找到要删除的行。leetcode中被接受的解决方案在电子邮件上进行完全自连接,这可能非常干净。在MySQL 8/SQL Server中,CTE和ROW_编号将在一次传递中找到非重复项。您必须比较已接受的查询和行号的执行计划,以找出哪一个是最好的,这是否有效?它正在从使用cte创建的pseuo表中删除。
delete from Person
where Id not in (
select temp.minimum from
(select min(Id) as minimum from Person group by Email) as temp
);