1
votes

Oracle supprime la combinaison en double de trois

J'ai une vue qui renvoie 3 colonnes avec 3 hachages. La troisième colonne est parfois nulle.

Ces combinaisons se répètent dans des ordres différents, par exemple:

select one, two, three from DUPLICATE_DOCUMENTS_3JOINS
where (three is null and two<one) or (three<two AND two<one);

Je pense que c'est 6 lignes pour 3 hachages joints.

Ces hachages sont en fait des identifiants pour le même fichier (mais ce n'est pas pertinent pour le moment).

**

J'ai essayé diverses choses et semble avoir trouvé un solution - mais je me demande s'il existe un moyen encore meilleur. Veuillez également noter que parfois l'une des 6 lignes est peut-être manquante.

J'essaie actuellement ce qui suit et cela semble fonctionner:

1,2,3
1,3,2
2,1,3
2,3,1
3,1,2
3,2,1

Des pensées à ce sujet?


0 commentaires

3 Réponses :


1
votes

Si vous ne voulez qu'une seule ligne, l'option la plus simple qui vous vient à l'esprit est une requête de limitation de ligne:

select one, two, three
from (
    select d.*, row_number() over(order by one, two, three) rn
    from duplicate_documents_3joins d
) d
where rn = 1

Dans Oracle 11g et versions antérieures, vous pouvez utiliser row_number ( ) à la place:

select d.*
from duplicate_documents_3joins d
order by one, two, three
fetch first row only


4 commentaires

Il se plaint que la commande SQL n'est pas correctement terminée. Probablement quelque chose de mineur.


Quelle version d'Oracle utilisez-vous? La syntaxe fetch a été ajoutée dans 12c.


Tirez, quelque chose. C'est bien cependant, la réponse est pertinente pour les autres.


@Menios: j'ai mis à jour ma réponse avec une solution équivalente pour les versions antérieures.



1
votes

Vous pouvez utiliser une sélection distincte:

SELECT DISTINCT
    LEAST(one, two, three) AS one,
    CASE WHEN one > two AND one < three
         THEN one
         WHEN LEAST(one, two, three) = one AND two < three
         THEN two
         ELSE three END AS two,
    GREATEST(one, two, three) AS three
FROM yourTable;

Étant donné les six enregistrements de votre exemple d'ensemble de données, qui sont les six permutations de 1, 2 et 3, la requête ci-dessus ne ferait que retourner un seul enregistrement 1, 2, 3. La logique ci-dessus devrait fonctionner pour n'importe quel ensemble de une, deux, trois valeurs (dans n'importe quel ordre).


0 commentaires

1
votes

Si vous avez trois jointures, corrigez le problème dans la joins:

select . . .
from t t1 join
     t t2
     on . . . and t1.one < t2.two join
     t t3
     on . . . and t2.two < t3.three

Cela peut être un peu plus compliqué si vous devez gérer jointure gauche , mais l'idée serait similaire.


0 commentaires