Elimination des doublons d'un Select sur 4 tables - SQL/NoSQL - Programmation
Marsh Posté le 03-10-2007 à 09:01:25
normal que ça sorte deux lignes, les informations sont complétements différentes entre les deux lignes: pas le même dpt et pas le même type de contrat.
Si tu veux uniquement le stagiaire avec la plus petite date d'entrée il faut utiliser la fonction d'aggregation min + une clause group by.
Mais tu vas vite te rendre compte que ça ne résoud que la moitié de ton problème dans la mesure ou tu as toujours la même problèmatique sur dept/type contrat.
Note: en cherchant un peu tu aurais trouvé 400 topics sur le sujet des doublons qui répondaient à ton problème.
Marsh Posté le 03-10-2007 à 09:10:45
La jointure me semble suspecte en plus... Tu veux pas en faire une propre?
Marsh Posté le 03-10-2007 à 09:18:37
Bas le souci que j'ai déja essayé le group by mais sa ne va pas du tout du tout plein d'erreur.
En gros j'ai penser faire un DISTINCT de la base RELATION (puisqu'elle contient l'id du stagiaire et l'id de l'entreprise + les dates)
stocké le resultat dans une table temporaire et faire le Select avec les clauses Where ensuite
Qu'en pensez vous ?
cela je sèche sur la syntaxe la :S
leflos5 a écrit : La jointure me semble suspecte en plus... Tu veux pas en faire une propre? |
C'est a dire ???? suspecte dans quel sens ?
Marsh Posté le 03-10-2007 à 09:36:05
hyptnos a écrit : Bas le souci que j'ai déja essayé le group by mais sa ne va pas du tout du tout plein d'erreur. |
mais bien sur, ça doit être la faute du GROUP BY
hyptnos a écrit : En gros j'ai penser faire un DISTINCT de la base RELATION (puisqu'elle contient l'id du stagiaire et l'id de l'entreprise + les dates) |
que ça résoudra pas ton problème, tu dois récupérer la plus petite date d'entrée et sans aggrégation tu n'y arriveras pas
hyptnos a écrit :
|
Certaines habitudes veulent que l'on écrive les jointures explicitement, quelque chose dans le genre:
Code :
|
Et pour ton problème je te le redis tu vas avoir besoin d'un min et ça ne sera pas suffisant.
Il va te falloir faire un truc dans le genre:
Code :
|
voila une bonne solution toute faite, mais je suis plus que dubitatif sur l'interêt pédagogique de la chose.
Marsh Posté le 03-10-2007 à 09:41:47
pour ta jointure, oublie la remarque de leflos5. il est pas réveillé, elle est bonne (mais mal écrite et effectivement pas pratique à lire)
pour le reste du problème, avant d'aller plus loin, est-ce que tu peux faire juste un petit truc ?
Code :
|
Avant de parler de doublons, faudrait déjà que tu sois sûr qu'il n'y a pas d'homonymes dans ta base.
Si les deux totaux ne sont pas égaux, c'est que tu en as (c'est à dire qu'un Georges Dupont habite à Paris, et un autre Georges Dupont habite à Marseille).
Ensuite, dans ta requête actuelle, tu peux ajouter le champ "stag_id" histoire de vérifier aussi quels sont les vrais "doublons" et quels sont les homonymes (deux fois le même ID et c'est effectivement un "doublon", sinon c'est simplement un homonyme -ou pollution de ta base de données-)
Pour le reste, +1 de ce qu'a dit Anapajari : j'ai déjà passé 2 heures à repondre à une question identique pas plus tard qu'hier, en expliquant la démarche étape par étape.
Marsh Posté le 03-10-2007 à 09:48:46
Merci je comprend a peut pret la chose
Du moins sur les jointures en effet c'est plus explicite et plus propre
Mais la j'ai une erreur au test de la requete :S
Citation : |
j'ai vérifier tout les champs etc... je vois pas ce qui cloche
Marsh Posté le 03-10-2007 à 09:50:36
MagicBuzz a écrit : pour ta jointure, oublie la remarque de leflos5. il est pas réveillé, elle est bonne (mais mal écrite et effectivement pas pratique à lire)
|
Les deux valeur sont identiques donc je pense que c'est une premiere chose de positive non?
Marsh Posté le 03-10-2007 à 10:01:14
positive, oui et non.
apparement, t'as effectivement pas d'homonyme.
donc ton TOTO qui a fait un CDI dans le 76 et un CDD dans le 61 semblerait être la même personne (bon, y'a d'autres vérifications à faire mais déjà là c'est bien parti)
pour le reste, t'as plus qu'à partir de la requête qu'à proposer Anajapari, ou une de celles que j'ai proposé dans un autre topic hier afin de ne conserver que le dernier des contrats de tes stagiaires.
Marsh Posté le 03-10-2007 à 10:13:41
Bon en fait je me galère pour rien
J'ai oublié de précisé que j'ai un champs date_sortie dans la table relation. Qui est a NULL si le stagiaire en question est toujours dans l'entreprise
Ce qui fait que cela simplifie considérablement la chose en rajoutant dans la close where de ma requete iniatial " RELATION.date_sortie IS NULL "
Voici la requete fonctionnelle
Merci en tout cas d'avoir pris le temps de m'avoir aider
Code :
|
Marsh Posté le 03-10-2007 à 10:18:58
ah ben oui, si t'as un moyen simple pour éliminer les doublons...
Marsh Posté le 03-10-2007 à 11:08:17
Heu juste un autre petit truc lol
Histoire de perfectionner un peu mon programme.
En effet je definit le type de contrat (CDD, CDI, etc..) dans l'ajout d'une relation. Or un CDI sa date de fin de contrat est définit ce qui fait qu'avec ma tel requete rien ne s'affichera pour un CDD
Donc faut que je puisse comparer le champs date_sortie de la table RELATION avec la date courante.
il me semble que en Sql l'appel a la date courrante est : CURRENT_DATE() ou DATE()
mais marche pas
je fait un
AND RELATION.date_sortie >= CURRENT_DATE()
mais non rien marche il me met
Citation : |
une idée ?
Marsh Posté le 03-10-2007 à 11:14:18
Arf oui j'avais pas pensé au objet commun.
Cela dit il me retourn
Citation :
|
Cependant si je fais dans l'analyseur de requete un
Code :
|
il me retourne bien la date courante
Donc au final je fait
Code :
|
mais il me sort
Citation :
|
grrrr vais pas y arriver
Marsh Posté le 03-10-2007 à 11:49:00
nan mais pourquoi tu colles ton getdate dans ton select
c'est juste pour remplacer ton current_date
et c'est normal que tu ne puisses pas atteindre un alias de champ dans ta clause where
Marsh Posté le 03-10-2007 à 11:57:19
Code :
|
Voila ca roule pfiou c'etait laborieux ^^
Enfin le principal c'est que cela fonctionne
Merci encore
Marsh Posté le 05-10-2007 à 22:27:02
Je maintiens qu'une jointure ne devrait pas se faire comme ça
Et non je crois pas qu'en programmation le principal soit que ça fonctionne
Marsh Posté le 03-10-2007 à 08:47:08
Bonjour tout le monde.
Voila a l'issus d'un développement en VB.net avec données stockée en BDD (SQL Server) je reste bloqué sur une requete. Je dois affiché des informations qui sont issus de 4 tables différentes. Jusque la tout va bien SELECT et WHERE sont de la partie.
Mais malheureusement je réupère des doublons
Alors j'ai fait un SELECT DISCTINCT mais il m'efface pas les doublons il me les classes (bizarre) surement le fait que je fait appel a 4 tables différentes.
Voila la requete actuelle
ce qui donne
Nom Prenom Session Entreprise dept Contrat date entréé
TOTO ******* ****** ******** 76 CDI **/**/**
***** ******* ****** ******** 14 CDF **/**/**
***** ******* ****** ******** 27 CDI **/**/**
TOTO ******* ****** ******** 61 CDD **/**/**
Comme vous pouvez le voir j'en es fait exprès de mettre un doublon.
Si je rajoute un DISCTINCT apres le selent voici ce qui me sort
Nom Prenom Session Entreprise dept Contrat date entréé
***** ******* ****** ******** 14 CDF **/**/**
***** ******* ****** ******** 27 CDI **/**/**
TOTO ******* ****** ******** 61 CDD **/**/**
TOTO ******* ****** ******** 76 CDI **/**/**
humm pas génial tout ca.
Donc en gros ce que je souhaite c'est pouvoir sortir la meme liste mais en ayant qu'une seule et unique fois 1 personne, et cela pour condition la date d'entréen (en entreprise) la plus recente
pour info
nom et prénom font partie de la table stagiaire
session fait partie de la table session
entreprise et département fait partie de la entreprise
contrat et date d'entrée fait partie de la table relation
Voila
merci par avance
Message édité par hyptnos le 03-10-2007 à 08:48:28