为什么这段代码在MySQL中运行良好,而在SQL Server中运行不好?

为什么这段代码在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

这是Leetcode中的一个问题:

基本上,这个问题要求删除重复的电子邮件,并保留具有最小索引的电子邮件

我的代码如下,我首先在SQLServer模式下运行它,它显示内部错误。但它已经通过了MySQL模式。为什么会发生这种情况?在本例中,它们之间是否存在语法差异?谢谢

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