Select Encadeado na mesma tabela

Boa tarde, estou com uma situação que não consegui resolver, tenho uma tabela de produtos que está sendo refeita.
Nesta tabela temos o campo código atual que será substituído por um novo código, de acordo com as normas fiscais vigentes, não posso excluir os itens da base, nesse caso tenho que bloquear e cadastrar novamente relacionando o código antigo ao novo.
Muitos cadastros já foram feitos, então no novo cadastro que é na mesma tabela possui o novo código e o código anterior. Preciso de uma query para comparar os campos códigos do antigo cadastro e do novo então tentei utilizar uma subquery mas não aceitei a mão.
Resumindo:
Dois dados na mesma tabela onde dado antigo possui código principal de ‘x’ e dado novo código principal de ‘y’ e código anterior de ‘x’ e preciso listar esses itens por código para comparação.
Grato.

Algo assim ajuda?

-- cv = cadastro velho, cn = cadastro novo
SELECT 
    cv.codigo AS COD_VELHO, 
    cn.codigo AS COD_NOVO
FROM tabela AS cv
LEFT JOIN tabela AS cn ON cn.codigo_anterior = cv.codigo

A idéia é trazer os cadastros velhos primeiros (por isso do LEFT JOIN), caso ele encontre vínculo entre o velho e o novo traz o novo junto… a partir do prefixo cn ou cv você consegue “puxar” os campos de cada cadastro, boa sorte!