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?
3 Réponses :
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
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.
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).
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.