OVH Cloud OVH Cloud

Requête : Avoir les trois derniers d'une table en JOIN ?

5 réponses
Avatar
Olivier
Bonjour,

Soit une table Personnes avec id, nom, prenom
une autre table Adresses avec id, person_id, code_postal, ville

une même personne peut avoir plusieurs adresses.

si je fais :

SELECT *
FROM personnes P
LEFT JOIN adresses A ON A.person_id = P.id
WHERE P.id = 1

cela me joint toutes les adresses :-(

Quelle requête peut me renvoyer une personne (x) avec seulement les trois
dernières adresses enregistrées.

Merci
Olivier

5 réponses

Avatar
Gilles
Bonjour olivier

Tu as surement une date de mise à jour des adresses !

cela donnerait un truc du style

SELECT top 3 *
FROM personnes P
LEFT JOIN adresses A ON A.person_id = P.id
WHERE P.id = 1
ORDER BY A.dateModif DESC

Gilles

"Olivier" a écrit dans le message de news:

Bonjour,

Soit une table Personnes avec id, nom, prenom
une autre table Adresses avec id, person_id, code_postal, ville

une même personne peut avoir plusieurs adresses.

si je fais :

SELECT *
FROM personnes P
LEFT JOIN adresses A ON A.person_id = P.id
WHERE P.id = 1

cela me joint toutes les adresses :-(

Quelle requête peut me renvoyer une personne (x) avec seulement les trois
dernières adresses enregistrées.

Merci
Olivier



Avatar
Thierry
SELECT TOP 3 *
FROM personnes P
LEFT JOIN adresses A ON A.person_id = P.id
WHERE P.id = 1
ORDER BY A.id DESC


--
Thierry


"Olivier" a écrit dans le message de news:

Bonjour,

Soit une table Personnes avec id, nom, prenom
une autre table Adresses avec id, person_id, code_postal, ville

une même personne peut avoir plusieurs adresses.

si je fais :

SELECT *
FROM personnes P
LEFT JOIN adresses A ON A.person_id = P.id
WHERE P.id = 1

cela me joint toutes les adresses :-(

Quelle requête peut me renvoyer une personne (x) avec seulement les trois
dernières adresses enregistrées.

Merci
Olivier



Avatar
Synopsis
Il faut passer par une colonne calculée de type "compteur-perso"

select
id_adresse
, (select count(*) from adresse b where b.id_adresse<=a.id_adresse and
b.id_personne = a.id_personne) as id_adresse_personne
, adresse
, cp
, ville
from adresse


Donc,

Select *
From Personne P
Join Adresse A on P.id_personne = A.id_personne
Where (select count(*) from adresse as ad where ad.id_adresse<=a.id_adresse
and ad.id_personne = a.id_personne) <= 3

Si id_adresse est un incrément automatique, le champ te donne implicitement
un ordre temporel
- L'opérateur <= sélectionne les 3 premières adresses crées
- L'opérateur => sélectionne les 3 dernières adresses crées









"Olivier" a écrit dans le message de
news:
Bonjour,

Soit une table Personnes avec id, nom, prenom
une autre table Adresses avec id, person_id, code_postal, ville

une même personne peut avoir plusieurs adresses.

si je fais :

SELECT *
FROM personnes P
LEFT JOIN adresses A ON A.person_id = P.id
WHERE P.id = 1

cela me joint toutes les adresses :-(

Quelle requête peut me renvoyer une personne (x) avec seulement les trois
dernières adresses enregistrées.

Merci
Olivier




Avatar
Fred BROUARD
Il n'y a pas de réponse logique à ta demande :

en effet les "3 dernières" suppose un ordre explicite chronologique des adresses
pour la saisie et la mise à jour. Or ta table des adresses ne fournit aucune
indication sur la chronologie de saisie. Même si tu prétend que la colonne id
est auto incrémentée par IDENTITY et que cela est suffisant c'est loin d'être
vrai dans tous les cas. Une colonne identity peut être forcée et pas du compteur
peut être forcé.

Donc il n'y a aucune solution logique à ta demande. Le select top 3 apportera
n'importe quoi sauf si, comme te l'as fait remarqué gilles, il y a une colonne
avec la date de dernière saisie et mise à jour.

A +

Olivier a écrit:
Bonjour,

Soit une table Personnes avec id, nom, prenom
une autre table Adresses avec id, person_id, code_postal, ville

une même personne peut avoir plusieurs adresses.

si je fais :

SELECT *
FROM personnes P
LEFT JOIN adresses A ON A.person_id = P.id
WHERE P.id = 1

cela me joint toutes les adresses :-(

Quelle requête peut me renvoyer une personne (x) avec seulement les trois
dernières adresses enregistrées.

Merci
Olivier





--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Avatar
Olivier
l'exemple était très simplifié et inexacte, je le reconnais :-)

merci pour les réponses

Olivier


"Fred BROUARD" a écrit dans le message de news:

Il n'y a pas de réponse logique à ta demande :

en effet les "3 dernières" suppose un ordre explicite chronologique des
adresses pour la saisie et la mise à jour. Or ta table des adresses ne
fournit aucune indication sur la chronologie de saisie. Même si tu prétend
que la colonne id est auto incrémentée par IDENTITY et que cela est
suffisant c'est loin d'être vrai dans tous les cas. Une colonne identity
peut être forcée et pas du compteur peut être forcé.

Donc il n'y a aucune solution logique à ta demande. Le select top 3
apportera n'importe quoi sauf si, comme te l'as fait remarqué gilles, il y
a une colonne avec la date de dernière saisie et mise à jour.

A +

Olivier a écrit:
Bonjour,

Soit une table Personnes avec id, nom, prenom
une autre table Adresses avec id, person_id, code_postal, ville

une même personne peut avoir plusieurs adresses.

si je fais :

SELECT *
FROM personnes P
LEFT JOIN adresses A ON A.person_id = P.id
WHERE P.id = 1

cela me joint toutes les adresses :-(

Quelle requête peut me renvoyer une personne (x) avec seulement les trois
dernières adresses enregistrées.

Merci
Olivier



--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************