Supprimez efficacement les lignes en double sans identifiants uniques dans Netezza
Lorsque vous traitez de grandes tables contenant des lignes en double, trouver le moyen le plus efficace de les supprimer peut s'avérer difficile. Même s'il a été prouvé que cette requête fonctionne dans SQL, qu'en est-il dans Netezza ?
Requête SQL brute
<code class="language-sql">WITH TempEmp AS ( SELECT name, ROW_NUMBER() OVER(PARTITION by name, address, zipcode ORDER BY name) AS duplicateRecCount FROM mytable ) DELETE FROM TempEmp WHERE duplicateRecCount > 1;</code>
Solution Netezza
L'instruction DELETE après la clause WITH n'est pas compatible avec Netezza. Veuillez envisager la solution suivante en utilisant le mot-clé USING :
<code class="language-sql">DELETE FROM table_with_dups T1 USING table_with_dups T2 WHERE T1.ctid < T2.ctid AND T1.name = T2.name AND T1.address = T2.address AND T1.zipcode = T2.zipcode;</code>
Aperçu des résultats
Pour consulter les enregistrements avant de les supprimer, remplacez DELETE par SELECT * et USING par une virgule, comme ceci :
<code class="language-sql">SELECT * FROM table_with_dups T1, table_with_dups T2 WHERE T1.ctid < T2.ctid AND T1.name = T2.name AND T1.address = T2.address AND T1.zipcode = T2.zipcode;</code>
Notes de performances
Si peu de doublons sont attendus, cette solution est plus performante que la solution utilisant la clause NOT IN (...), qui génère un grand nombre de lignes dans la sous-requête. De plus, si la colonne clé contient des valeurs NULL, utilisez COALESCE() pour gérer la comparaison, par exemple :
<code class="language-sql">AND COALESCE(T1.col_with_nulls, '[NULL]') = COALESCE(T2.col_with_nulls, '[NULL]')</code>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!