Почему этот код хорошо работает на MySQL, а не на SQL Сервере? - PullRequest
1 голос
/ 20 февраля 2020

Это вопрос в Leetcode: https://leetcode.com/problems/delete-duplicate-emails/solution/

В основном вопрос состоит в том, чтобы удалить дубликаты электронных писем и сохранить тот, который имеет минимальный индекс.

My Код следующий, и я сначала запустил его в режиме SQL Сервер , и он показывает «Внутренняя ошибка». Но он перешел в режим MySQL. Почему это происходит? Есть ли синтаксические различия между ними, показанные в этом случае? Спасибо.

delete from Person
where Id not in (
select temp.minimum from 
(select min(Id) as minimum from Person group by Email) as temp
);

Ответы [ 4 ]

1 голос
/ 20 февраля 2020

В SQL Server вы используете CTE с ROW_NUMBER():

WITH cte AS (
     SELECT P.*, ROW_NUMBER() OVER (PARTITION BY p.email ORDER BY id) AS seq
     FROM Person P
)
DELETE
FROM cte c
WHERE c.seq > 1;

Однако ваша исходная версия запроса также должна работать в SQL Server.

0 голосов
/ 20 февраля 2020

Большое спасибо всем. Я хорошо запустил его в SSMS, поэтому думаю, что это не из-за SQL стороны сервера.

0 голосов
/ 20 февраля 2020

Я пробовал это на sql сервере 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
);

Он удаляет один строка ...

Надеюсь, это поможет

0 голосов
/ 20 февраля 2020

выглядит хорошо для меня. Возможно

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, чтобы увидеть, что это та же схема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...