Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
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 16/11/2010, 16h21   #1
Débutant
 
Inscription : février 2007
Messages : 261
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 261
Points : 17
Points : 17
Par défaut Erreur : ora 01427

Bonsoir,

J’ai deux tables=>
tab1 (id1, voiture, matricule1, date1, codePersonne)
Tab2 (id2, nom2, prenom2, matricule2)

Code :
1
2
3
4
 
SELECT *
FROM tab1 t1, tab2 t2
WHERE t1. codePersonne = t2.id2
Cette requête me donne plusieurs lignes sur même personne mais moi je veux que la ligne de la date plus récente pour chaque personne

Code :
1
2
3
4
SELECT *
FROM tab1 t1, tab2 t2
WHERE t1.codePersonne = t2.id2
AND t1.date1= (SELECT max (date1) FROM tab1)
Mais cette requête donne le max de ts
Code :
1
2
3
4
5
 
SELECT *
FROM tab1 t1, tab2 t2
WHERE t1.codePersonne = t2.id2
AND t1.codePersonne = (SELECT codePersonne FROM tab1 WHERE date1= (SELECT (max (date1) FROM tab1)
Mais cette requête me donne une erreur d oracle : ora 01427 (car j ai plusieurs lignes)

Est-ce que je dois faire un group by ou faire 2 requêtes dans ce cas ?
sonia5 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2010, 16h54   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 680
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 680
Points : 10 479
Points : 10 479
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Essayez ainsi :
Code :
1
2
3
4
5
6
7
8
9
10
11
WITH new_tab1 AS
(
SELECT t1.*,
       row_number() over(partition BY t1.codePersonne ORDER BY t1.date1 DESC) AS rn
  FROM tab1 t1
)
SELECT *
  FROM new_tab1 t1
       INNER JOIN tab2 t2
         ON t2.id2 = t1.codePersonne
 WHERE t1.rn = 1;
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2010, 17h22   #3
Débutant
 
Inscription : février 2007
Messages : 261
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 261
Points : 17
Points : 17
Merci, mais est ce qu'il y a une autre solution sans créer une autre table
sonia5 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2010, 17h31   #4
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 680
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 680
Points : 10 479
Points : 10 479
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
La solution indiquée ne crée pas de table, c'est juste un select.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2010, 17h56   #5
Débutant
 
Inscription : février 2007
Messages : 261
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 261
Points : 17
Points : 17
Merci pour la réponse mais peux m expliquer cette logique car ce que j ai compris ici on tu prends tous les éléments de la table t1 on prend que la ligne de la date récente et après tu fais un jointure ma question pourquoi tu fais a quoi sert ça et aussi pourquoi on utilise i au lieu d une normale jointure ??
sonia5 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2010, 17h59   #6
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 680
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 680
Points : 10 479
Points : 10 479
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
C'est la jointure normale selon la norme ANSI.
Perdez l'habitude d'utiliser la virgule.

Pour le over(...), c'est ce qu'on appelle une fonction de fenêtrage.
Vous pouvez lire cet article de SQLPro :
http://sqlpro.developpez.com/article...clause-window/
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2010, 11h49   #7
Débutant
 
Inscription : février 2007
Messages : 261
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 261
Points : 17
Points : 17
Bonjour,
Est ce que je peux travailler avec 2 WITH NEW_TAB AS
C à d 2 imbriqués car je veux le max de la date de la table tab1 et aussi tab2 et enfin de faire la jointure entre tab1, tab2 et tab3
Merci d'avance
sonia5 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2010, 12h16   #8
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 680
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 680
Points : 10 479
Points : 10 479
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Oui, il faut leur donner deux noms différents :
Code :
1
2
3
4
5
6
7
8
9
WITH new_tab1 AS
(
...
)
  ,  new_tab2 AS
(
...
)
SELECT ...
__________________
Email : http://scr.im/waldar
Waldar 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 15h22.


 
 
 
 
Partenaires

Hébergement Web