Question

Je génère dynamiquement une requête comme ci-dessous qui crée des combinaisons différentes de règles de gauche de liaison (un nombre quelconque de fois) sur elle-même et d'éviter certaines des règles avec les mêmes attributs que partie du joint, par exemple des conditions

SELECT count(*) 
FROM rules AS t1 
LEFT JOIN rules AS t2
 ON t1.id != t2.id
 AND ...
LEFT JOIN rules AS t3
 ON t1.id != t2.id AND t1.id != t3.id AND t2.id != t3.id
 AND ...

je retire actuellement des doublons en créant un tableau de ids des lignes jointes tri et le regroupement puis en les:

SELECT sort(array[t1.id, t2.id, t3.id]) AS ids
...
GROUP BY ids

Je voudrais savoir s'il y a une meilleure façon d'éliminer les doublons par exemple.

t1.ID | t2.ID | t3.ID
---------------------
  A   |   B   |   C
  C   |   B   |   A

doit être

t1.ID | t2.ID | t3.ID
---------------------
  A   |   B   |   C

ou

t1.ID | t2.ID | t3.ID
---------------------
  C   |   B   |   A

Mais pas les deux.

EDIT:. Je voudrais passer d'une permutation de lignes à une combinaison de lignes

Était-ce utile?

La solution

Je vous suggère plutôt que de se joindre à! =, Essayez de joindre sur <=.

Vous aurez alors toutes les combinaisons avec t1.id> t2.id, t2.id> t3.id, et ainsi de suite.

Les lignes ne seront pas « doublons » parce qu'ils sont ensembles ordonnés, et tout ensemble contenant des éléments équivalents entraînerait nécessairement dans l'ensemble identique ordonnée.

Autres conseils

Je pense que vous voulez dire que vous voulez passer d'une permutation de lignes à une combinaison de lignes?

Dans ce cas, les réponses sélectionnez distinctes sont fausses. Sélectionnez distinct sélectionnera les permutations distinctes. Je pense que vous avez une assez bonne façon de le faire. La seule chose que je peux penser, serait de concaténer les règles dans une chaîne et le genre en place. Il semble que vous utilisez Postgresql et il n'y a pas de fonction qu'il fait dans les fonctions de chaîne intégrées.

Si la quantité de symboles étaient de petite taille, vous pourriez être en mesure de les insérer dans le tableau pré-triée en insérant « A » dans l'indice 1 « B » dans l'index 2, etc. Ce qui pourrait pourrait le genre plus rapide ...

Vous devez obtenir un ordre dans vos résultats afin de filtrer tous les doublons sur. Ceci peut être réalisé en faisant en sorte que a<b<c. Et une fois que vous avez un ordre dans vos résultats, vous pouvez appliquer une distincte au resultset.

` SELECT COUNT (*) des règles T1

LEFT JOIN règles AS t2 t1.id! = T2.id ET

LEFT JOIN règles AS t3 t1.id! = T2.id ET t1.id! = T3.id ET t2.id! = T3.id ...

t1.id

... `

Difficile de comprendre exactement ce que vous essayez d'atteindre, mais pour éviter la duplication A-B-C C-B-A, essayez ceci:

SELECT count(*) 
FROM rules AS t1 
LEFT JOIN rules AS t2
 ON t1.id **<** t2.id
 AND ...
LEFT JOIN rules AS t3
 ON t1.id **<** t2.id AND t1.id **<** t3.id AND t2.id **<** t3.id
 AND ...

De cette façon, les réponses sont toujours commandées

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top