Opa, tudo bom Yago?
Então, alguns adendos ao código anterior:
Primeiramente, ele poderia ser executado em uma só consulta, porém, não fica muito legível e seria necessário incluí-los como sub consultas.
Em segundo lugar, ele não possibilita a exclusão caso você tenha mais de um dado que se repete na tabela, no exemplo que você passou ele não funcionaria se além do "João", tivesse o "Yago" também repetido.
Para solver isso, daria-se necessário o uso de loops ou recursividade(lembrando que o SQL só permite 32 vezes a execução recursiva e que só é possível através de Stored Procedures).
Quanto a ultima pergunta, dei uma olhada nos cursos de infraestrutura, aparentemente não vi nada sobre...
De qualquer forma, se quiser dar uma pesquisada mais a fundo, esse trecho de código que eu postei é referente ao tópico de "Stored Procedures e Functions em SQL".
Abaixo a procedure funcional de exclusão de valores duplicados, dentro do exemplo postado:
CREATE PROCEDURE [dbo].[DELETAR_FUNCIONARIO_SEM_RECURSIVIDADE]
as
DECLARE @ExisteColaborador int =
(
SELECT top(1)COUNT(colaborador) AS NumOccurrences
FROM FUNCIONARIOTESTE
GROUP BY colaborador
HAVING ( COUNT(colaborador) > 1 )
)
while @ExisteColaborador > 1 or @ExisteColaborador is not null
begin
SET @ExisteColaborador =
(
SELECT top(1)COUNT(colaborador) AS NumOccurrences
FROM FUNCIONARIOTESTE
GROUP BY colaborador
HAVING ( COUNT(colaborador) > 1 )
)
DELETE FROM FUNCIONARIOTESTE
WHERE
COLABORADOR = (SELECT TOP(1)COLABORADOR
FROM FUNCIONARIOTESTE
GROUP BY COLABORADOR
HAVING (COUNT(COLABORADOR) > 1))
AND
ID = (SELECT TOP(1) ID
FROM FUNCIONARIOTESTE
WHERE COLABORADOR =
(SELECT TOP(1)COLABORADOR
FROM FUNCIONARIOTESTE
GROUP BY COLABORADOR
HAVING (COUNT(COLABORADOR) > 1))
)
end
GO
Ao executar este código, ele irá criar um procedimento armazenado.
Depois disso, basta entrar na tua base e executar o comando:
EXEC DELETAR_FUNCIONARIO_SEM_RECURSIVIDADE