Supposons que vous implémentez l'instruction DELETE pour un moteur SQL. Comment allez-vous supprimer deux lignes d'une table qui sont exactement identiques? Vous avez besoin de quelque chose pour distinguer l'un de l'autre! Vous pouvez réellement pas supprimer des lignes entièrement double (toutes les colonnes étant égales par ailleurs) sous les contraintes suivantes (comme il est prévu pour vous)
- Aucune utilisation de ROWID ou ROWNUM
- Aucune table temporaire
- Aucun code de procédure
Cela peut toutefois être fait même si l'une des conditions est relâchée.Voici les solutions en utilisant au moins une des trois conditions
assumer table est définie comme ci-dessous
Créer une table t1 (
col1 vacrchar2 (100),
nombre col2 (5),
col3 numéro (2)
);
identification des lignes en double:
Sélectionner col1, col2, col3
du groupe t1
par col1, col2, col3
comptage ayant (*)> 1
lignes en double peuvent aussi être identifié en utilisant ceci: sélectionnez c1, c2, c3, row_number() over (partition par (c1, c2, c3) ordre par c1, c2, c3) rn
de t1
REMARQUE: La fonction analytique row_number() ne peut pas être utilisée dans une instruction DELETE comme suggéré par JohnFx au moins dans Oracle 10g.
- solution en utilisant ROWID
Supprimer de t1 où row_id>
(select min (t1_inner.row_id) à partir de t1 t1_innner
où t1_inner.c1 = t1.c1 et t1_inner.c2 = t1.c2 et t1_inner.c3 = t1.c3))
- solution en utilisant la table temporaire
créer t1_dups de table que (
// requête d'écriture ici pour trouver les lignes en double comme ci-dessus // liste
)
supprimer de t1
où t1.c1, t1.c2, t1.c3 dans (select * from t1.dups)
insert dans t1 (
select c1, c2, c3 de t1_dups)
- solution à l'aide du code de procédure
Cela va utiliser une approche similaire au cas où nous utilisons une table temporaire.
Pouce. Croyez-moi. Vous ne voulez pas ce travail de toute façon. Une question où ils vous font attacher les mains derrière le dos comme cela est généralement plus destiné à montrer comment intelligent l'intervieweur n'est pas tester le candidat. – JohnFx
Merci, JohnFx, pour le soutien ... me rend plus heureux que je n'ai pas poursuivi ce travail. –
La dernière chose que vous voulez est un patron qui ne veut pas une solution, il/elle veut leur solution. C'est une erreur de gestionnaire recrue et très narcissique pour essayer d'embaucher des clones de vous-même. – JohnFx