[SQL] Disctinct sur plusieurs champs

Disctinct sur plusieurs champs [SQL] - SQL/NoSQL - Programmation

Marsh Posté le 16-11-2005 à 09:20:30    


Est ce possible de faire un select disctinct sur 2 champs? Quelque chose du style :
 

Code :
  1. select distinct(tc.ct_code, tc.et_code)
  2. from TMP_CHANTIER tc, TMP_COMPOSITION_CHAINE tcc
  3. where tc.ct_type_local = 'D'
  4.   and tc.ct_code = tcc.ct_code
  5.   and tc.et_code = tcc.et_code


 
Afin de respecter une regle de gestion de mon appli :
 

Code :
  1. Pour chaque duo ct_code et et_code de TMP_CHANTIER ayant le ct_type_local (TMP_CHANTIER) égale à 'D', le duo ct_code et et_code doit obligatoirement être référencé une seule fois au sein de la table TMP_COMPOSITION_CHAINE


 
Moi je pensais comparer le nombre de résultats en le select normal et le select distinct. Mais il refuse de faire un select disctinct sur plusieurs champs.
 
Est ce que quelqu'un a une idée?

Reply

Marsh Posté le 16-11-2005 à 09:20:30   

Reply

Marsh Posté le 16-11-2005 à 09:38:19    

Le distinct n'est pas lié à un ou plusieurs champs.
Le distinct filtre le résultat d'une requête pour éliminer les lignes en double.

Reply

Marsh Posté le 16-11-2005 à 09:45:41    

Pour vérifier que le duo n'existe qu'une seule fois, il existe plusieurs techniques, comme par exemple de lister les duos et avoir une sous requête pour lister des duos sur des lignes différentes, mais c'est long et cela nécessite d'avoir les numéros des enregistrements ce qui dépend de l'implémentation de la base.
 
Donc je ense plutôt à une solution avec un count(*) :

Code :
  1. SELECT tc.ct_code, tc.et_code, count (*)
  2. from TMP_CHANTIER tc, TMP_COMPOSITION_CHAINE tcc
  3. where tc.ct_type_local = 'D'
  4.   and tc.ct_code = tcc.ct_code
  5.   and tc.et_code = tcc.et_code
  6. GROUP BY tc.ct_code, tc.et_code
  7. HAVING count(*) > 1


Reply

Marsh Posté le 16-11-2005 à 09:50:26    

Et apres je teste le nb d'élément renvoyé par ma requete. Si le nombre est nul c'est que ma regle de gestion est vérifié. C'est bien ca???

Reply

Marsh Posté le 16-11-2005 à 10:03:25    

Et pour faire qqch qui regarde si il existe au moins un enregistrement:
 
pour chaque duo ct_code et et_code de TMP_CHANTIER ayant le ct_type_local (TMP_CHANTIER) égale à 'M' ou 'V', le duo ct_code et et_code doit obligatoirement être référencé au moins une fois au sein de la table TMP_COMPOSITION_CHAINE

Reply

Marsh Posté le 16-11-2005 à 10:23:04    

En fait, je n'ai peut-être pas bien compris la question. Excuse-moi.
 
J'ai cru que la base avait été remplie avec des données quelconques, et qu'il fallait y faire un peu de ménage, et notamment repérer les doublons pour les enlever. Dnas ce cas, je fais passer ma requête qui me donne les doublons, les triplons, etc.
 
Mais, s'il faut juste éviter d'insérer des doublons dans une base propre, alors, ma requête est inutile. Il faut simplement faire une lecture dans la base prélablement à une insertion pour voir si un duo existe déjà. S'il existe, on ne fait pas d'insertion. Donc, ce serait juste un Select ordinaire à faire avant une insertion éventuelle.

Reply

Marsh Posté le 16-11-2005 à 13:27:27    

et distinct (ch1, ch2), ch3... from... ça marche pas?

Reply

Marsh Posté le 16-11-2005 à 14:07:40    

non ca ne marche pas

Reply

Marsh Posté le 17-11-2005 à 02:51:57    

Pour moi un select distinct évite un doublon sur un champ et logiquement ça se comprend ;) Sauf si tu as un index sur plusieurs champs où là on pourrait comprendre que ça évince les doublons mais y'en aurait pas vu que index multiple pour valeur unique :D
 
En gros on sait toujours pas dans quelle condition tu veux faire ça et que c'est probablement un soucis de modélisation de ton truc dans ta base :)
 
Après reste les triggers si c'est plus difficile qu'un simple index unique sur plusieurs champs ;)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed