Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/12/2010, 20h18   #1
Invité régulier
 
Inscription : octobre 2010
Messages : 35
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 35
Points : 7
Points : 7
Par défaut Requêtes SQL bizarres

Bonsoir j’ai deux requêtes SQL sur les quelles je bloque (oui je suis débutant)

1/ j’ai trois tables comme suit :

Tab1 (ID1, Nom1, Prenom1)

Tab2 (ID2, Prenom2, Date_Naissance, Sex)

Tab3 (ID3, Nom3, Adresse, Sex)

Je veux avoir

Tab4 (ID4, Nom1, Prenom1, Date_Naissance, Adresse)

J’ai essayé ça mais je ne suis pas sur de mon coup

Code :
1
2
3
4
5
SELECT A.Nom1, A.Prenom1, B.Date_Naissance, C. Adresse
 FROM  Tab1 A
INNER joint Tab2 B ON A. Prenom1 = B. Prenom2
INNER joint Tab3 C ON  A.Nom1 =  C. Nom3
                             AND  B.Sex = C.Sex
2/ J’ai une table qui contient plusieurs doublons et je veux récupérer que la ligne la plus récente

Tab5 (ID5, Nom, Prenom, Adresse, Date_MAJ)

Code :
1
2
3
4
5
1, GRANT, lisa, 43 rue bla bla, 01/01/2001
2, GRANT, lisa, 86 rue bla bla, 16/03/2005
3, GRANT, lisa, 7 bis rue bla bla, 27/08/2010
4, mlou, toto, 28 BD titi, 28/07/1995
5, mlou, toto, 205 BD titi, 15/10/2005
Résultat :
Code :
1
2
3, GRANT, lisa, 7 bis rue bla bla, 27/08/2010
5, mlou, toto, 205 BD titi, 15/10/2005
D’avance merci
sql_bin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2010, 20h53   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
Bonjour,

Je pense qu'il y a un énorme problème de conception dans votre base.

Que fait-on quand 2 personnes ont le même prénom / nom / sexe ?

Sinon ça m'a l'air correct si on fait fi du problème initial

Citation:
2/ J’ai une table qui contient plusieurs doublons et je veux récupérer que la ligne la plus récente
Vous allez devoir passer par une sous-requête qui va faire un group-by sur l'id et prenne le min ou le max de la date pour récupérer l'ordre souhaiter de votre tri.
Ensuite retrouvez les enregistrements initiaux avec ceci.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 16/12/2010, 10h32   #3
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour

à quoi correspondent les ID1, 2, 3, 4,...

comme le dit punkoff, vous avez un énorme problème avec votre base, il faut donc que vous nous disiez exactement ce qui permet de faire le lien entre les différentes table (si j'en crois votre première requête, vous faite le lien entre la table1 et la table2... grâce au prénom !!! )

et si j'en crois aussi votre exemple avec les doublons, vos ID ne servent a rien, car la même personne aurait des ID différents !

Dites en nous un peu plus sur le contexte (est-ce une base déjà en production, ou êtes-vous en train de développer, quelle est l'origine des données,...), car je crois que vous avez des problèmes a résoudre en amont de celui que vous exposez ici !
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 10h48   #4
Invité régulier
 
Inscription : octobre 2010
Messages : 35
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 35
Points : 7
Points : 7
merci punkoff, aieeeuuuuu,
alors oui la base est toute pourrie

ReQ1:
les tables n'ont aucun lien entre elles ... le but est depuis un nom et prénom récupérer le max d'informations (on cherche a créer une nouvelle table qui regroupe les informations).. oui effectivement je dois faire une jointure sur le prénom (ou le nom et prénom ... j'ai juste résumé un problème encore plus chiant)... les id ne servent à rien en dehors de la table elle même

ReQ2:
L'ID est issu d'une autre table contrats et vu qu'une personne peut avoir plusieurs contacts à des dates différentes on veut avoir la dernière adresse de la personne

@punkoff: je ne vois pas comment faire la sous requête SVP une petite aide merci.
je réédite pour répondre à ta question
on prend la donnée la plus récente (la ReQ2 )
sql_bin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 11h01   #5
Invité régulier
 
Inscription : octobre 2010
Messages : 35
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 35
Points : 7
Points : 7
Merci tous

pour la ReQ 2 j'ai fais celà

Code :
1
2
3
4
SELECT X.ID, X.Nom, X.DONNEE, X.Date_Maj FROM dbo.TEST_MAX_LOAD X
WHERE Date_Maj IN (SELECT max (y.Date_Maj) FROM dbo.TEST_MAX_LOAD Y
WHERE Y.Nom = X.Nom
GROUP BY y.Nom)

c'est ok
sql_bin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 11h22   #6
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Citation:
Envoyé par sql_bin Voir le message
Merci tous

pour la ReQ 2 j'ai fais celà

Code :
1
2
3
4
SELECT X.ID, X.Nom, X.DONNEE, X.Date_Maj FROM dbo.TEST_MAX_LOAD X
WHERE Date_Maj IN (SELECT max (y.Date_Maj) FROM dbo.TEST_MAX_LOAD Y
WHERE Y.Nom = X.Nom
GROUP BY y.Nom)

c'est ok
avec le MAX(), votre sous requete ne renverra jamais plus d'une ligne, vous pouvez donc remplacer le IN par un =...

Mais je pense que vous pouvez faire mieux a partir de cette requete, en remplacant votre sous requete par une pseudo table
Code sql :
1
2
3
4
 
SELECT Nom, MAX(Date_Maj) AS MAX_DATE_MAJ
FROM TEST_MAX_LOAD 
GROUP BY Nom

et en faisant une jointure sur la date (et sur le nom aussi bien sur !)
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 11h59   #7
Invité régulier
 
Inscription : octobre 2010
Messages : 35
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 35
Points : 7
Points : 7
@aieeeuuuuu: UN GRAND MERCI
Mais le In me retourne deux lignes!! (voir mon exemple un peu plus haut)
C'est quoi la différence entre les deux méthodes (la mienne et avec pseudo table) Merci.
sql_bin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 13h07   #8
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Code sql :

SELECT max (Date_Maj)
FROM dbo.TEST_MAX_LOAD



Vous renvoie deux lignes ??????

Quel est votre SGBDR, il va peut être falloir songer à en changer...

pour ce qui est de la jointure, elle sera plus performante qu'avec une sous requete
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 14h16   #9
Invité régulier
 
Inscription : octobre 2010
Messages : 35
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 35
Points : 7
Points : 7
Oui elle me retourne deux ligne
Code :
1
2
3
SELECT max (y.Date_Maj) FROM dbo.TEST_MAX_LOAD Y
--WHERE Y.Nom = X.Nom
GROUP BY y.Nom
Je suis sous SQL Server 2005
sql_bin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 14h21   #10
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 463
Points : 10 463
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Avec SQL-Server 2005 on écrit plutôt comme ceci :
Code :
1
2
3
4
5
6
7
8
9
WITH Tab5_new (ID5, Nom, Prenom, Adresse, Date_MAJ, rn) AS
(
SELECT ID5, Nom, Prenom, Adresse, Date_MAJ,
       row_number() over(partition BY Nom ORDER BY Date_MAJ DESC)
  FROM Tab5
)
SELECT ID5, Nom, Prenom, Adresse, Date_MAJ
  FROM Tab5
 WHERE rn = 1
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 14h32   #11
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Citation:
Envoyé par sql_bin Voir le message
Oui elle me retourne deux ligne
Code :
1
2
3
SELECT max (y.Date_Maj) FROM dbo.TEST_MAX_LOAD Y
--WHERE Y.Nom = X.Nom
GROUP BY y.Nom
Je suis sous SQL Server 2005

Arff, désolé, je n'avais pas vu que le GROUP BY faisait partie de la sous requête, d'ailleurs je ne comprend pas trop son intérêt, car vous filtrez déjà par nom, et s'il vous renvoie plus d'une ligne, c'est que vous avez plusieurs prénoms pour un seul et même nom, vous devriez donc ajouter un Y.prenom = X.Prenom dans la clause WHERE de votre sous requête, sinon vous aurez des résultats erronés...
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h07.


 
 
 
 
Partenaires

Hébergement Web