24 votes

Sélectionner les paires uniques dans la jointure automatique

J'essaie d'écrire une requête simple en sqlite avec une jointure automatique. Je veux toutes les paires d'ID des produits qui ont le même coût, mais je veux des paires uniques (c.-à-d. ne pas lister la même paire deux fois, même dans un ordre différent). Voici ce que j'ai :

SELECT b1.Id, b2.Id
FROM Basic AS b1
LEFT JOIN Basic AS b2
ON b1.cost = b2.cost
WHERE b1.Id != b2.Id
AND b1.Cost = 5;

J'obtiens donc quelque chose comme

23 | 101
23 | 205
24 | 103
101 | 23 <-- Duplicate!

J'ai essayé différentes combinaisons de DISTINCT et GROUP BY mais j'obtiens toujours des paires dupliquées :

J'ai essayé des choses comme

SELECT DISTINCT bp1.Id, bp2.Id ...

& ... = 5 GROUP BY bp1.Id, bp2.Id ;

Comment puis-je me débarrasser des paires en double ? Vous avez des idées ?

Je vous remercie de votre aide !

44voto

Mark Byers Points 318575

Changer != à < dans votre clause WHERE afin de garantir que l'identifiant le plus bas soit toujours placé en premier :

WHERE b1.Id < b2.Id

0voto

scottlittle Points 4898

Si vous avez plus d'un jeu d'identifiants de longueurs différentes, par exemple, une simple comparaison des identifiants WHERE b1.Id < b2.Id ne fonctionnera pas. Pour obtenir tous les ID dans le même espace de travail, vous pouvez utiliser le hachage MD5 dans la clause where :

WHERE MD5(b1.Id) < MD5(b2.Id)

Dans sqlite, la fonction de hachage MD5 n'est pas forcément intégrée, mais vous pouvez utiliser à sa place n'importe quelle fonction de hachage intégrée ou créer votre propre fonction de hachage définie par l'utilisateur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X