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
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
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" <aa@aa.fr> a écrit dans le message de
news:e5gE7flyFHA.596@TK2MSFTNGP12.phx.gbl...
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.
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
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 ***********************
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 ***********************
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 ***********************
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 ***********************
l'exemple était très simplifié et inexacte, je le reconnais :-)
merci pour les réponses
Olivier
"Fred BROUARD" <brouardf@club-internet.fr> a écrit dans le message de news:
uagNnLnyFHA.2652@TK2MSFTNGP14.phx.gbl...
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 ***********************
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 ***********************