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 25/10/2011, 11h44   #1
Invité régulier
 
Homme
Inscription : octobre 2011
Messages : 20
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Tourisme - Loisirs

Informations forums :
Inscription : octobre 2011
Messages : 20
Points : 8
Points : 8
Par défaut Jointure et champs null

Bonjour à tous,

Je n'ai pas fais de SQL depuis plusieurs années, mais dans le cadre du développement d'une base Access, j'ai eu besoin de m'y remettre... Jusque là, ça allait, mais je bloque et j'ai besoin de votre aide

Ma base concerne des plantes.
Une plante appartient à une espèce, qui appartient à un genre, qui appartient à une famille.
Et, parfois, une plante appartient aussi à une sous-espèce.

Dans ma table "Plante", j'ai donc l'identifiant de l'espèce (obligatoire et qui me permet de retrouver genre et famille) et l'identifiant de la sous-espèce (parfois null).

Le code suivant me permet de récupérer tout ce qu'il me faut concernant la plante, l'espèce, le genre et la famille (et la dernière année de floraison, mais passons ^^) :

Code :
1
2
3
4
5
6
7
SELECT Plante.*, Famille.NomFamille, Genre.NomGenre, Espèce.*, Année_floraison
FROM Plante, Famille, Genre, Espèce, Années_floraisons
WHERE Plante.IdPlante = ...
AND Plante.IdEspèce = Espèce.IdEspèce
AND Espèce.IdGenre = Genre.IdGenre
AND Genre.IdFamille = Famille.IdFamille
AND Année_floraison = (SELECT MAX(Années_floraisons.Année_floraison) AS Année_max FROM Années_floraisons WHERE IdPlante = ...);
J'aimerai savoir comment y ajouter les informations de la sous-espèce, quand le champ IdSous_espèce de ma table Plante n'est pas null et que je ne me retrouve pas avec un retour vide dans le cas où ce champ est null (et que j'aurai jointé dans le vide).

Je suis compréhensible ?


J'ai regardé du coté des UNION, JOIN... mais je n'ai bien compris leurs fonctionnements et la transposition des exemples que j'ai trouvé ne m'a donné que des erreurs.


Donc si quelqu'un pouvait me mettre sur la voie, ça serait cool !
Merci d'avance !
Tevsox est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2011, 12h58   #2
Membre Expert
 
Avatar de zoom61
 
Homme Vincent ...
Passionné d'informatique
Inscription : janvier 2005
Messages : 1 217
Détails du profil
Informations personnelles :
Nom : Homme Vincent ...
Âge : 39
Localisation : France, Haute Vienne (Limousin)

Informations professionnelles :
Activité : Passionné d'informatique
Secteur : Industrie

Informations forums :
Inscription : janvier 2005
Messages : 1 217
Points : 1 506
Points : 1 506
Envoyer un message via Yahoo à zoom61 Envoyer un message via Skype™ à zoom61
Salut,

Regarde la fonction LEFT JOIN cela devrait convenir à ce que tu veux faire.

@+.
__________________
N'oubliez pas le Tag :

C'est en parvenant à nos fins par l'effort, en étant prêt à faire le sacrifice de profits immédiats en faveur du bien-être d'autrui à long terme, que nous parviendrons au bonheur caractérisé par la paix et le contentement authentique. [Dalaï Lama]
Je ne réponds pas aux messages privés s'ils sont liés à une question du forum

Mon site sur Developpez.com
zoom61 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 25/10/2011, 14h22   #3
Invité régulier
 
Homme
Inscription : octobre 2011
Messages : 20
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Tourisme - Loisirs

Informations forums :
Inscription : octobre 2011
Messages : 20
Points : 8
Points : 8
Bonjour et merci de ta réponse.

En effet, LEFT JOIN semble être l'opérateur qu'il me faut après lecture de la doc. Merci

Par contre, j'ai un soucis de syntaxe maintenant...

Le code dans mon 1er post marche.
Le code suivant marche aussi :
Code :
1
2
3
4
SELECT P.IdPlante, S.NomSous_espèce
FROM Plante P
LEFT OUTER JOIN Sous_espèce S
ON P.IdSous_espèce = S.IdSous_espèce;
Il m'affiche bien chaque ligne avec une cellule vide si je n'ai pas de sous-espèce.

Par contre, je n'arrive pas à réunir des deux codes...
Code :
1
2
3
4
5
6
7
8
SELECT P.IdPlante, P.Numero_collection, F.NomFamille, G.NomGenre, E.NomEspèce, S.NomSous_espèce
FROM Espèce E, Genre G, Famille F, Plante P
LEFT JOIN Sous_espèce S
  ON P.IdSous_espèce = S.IdSous_espèce
WHERE P.IdPlante = 73
AND P.IdEspèce = E.IdEspèce
AND E.IdGenre = G.IdGenre
AND G.IdFamille = F.IdFamille;
Citation:
Expression JOIN non supportée.
Dois-je complètement modifier la syntaxe de ma requête pour utiliser le JOIN ?
Si oui, comment ?
Tevsox est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2011, 14h30   #4
Membre confirmé
 
Homme Grégoire MARTIN
Ingénieur développement logiciels
Inscription : janvier 2011
Messages : 128
Détails du profil
Informations personnelles :
Nom : Homme Grégoire MARTIN
Âge : 32
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Finance

Informations forums :
Inscription : janvier 2011
Messages : 128
Points : 225
Points : 225
Bonjour,

Il ne faut pas melanger les 2 syntaxes .

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
SELECT P.IdPlante, P.Numero_collection, F.NomFamille, G.NomGenre, E.NomEspèce, S.NomSous_espèce
FROM         Plante            P
  INNER JOIN Années_floraisons A ON A.IdPlante  = P.IdPlante
  INNER JOIN Espèce            E ON E.IdEspèce  = P.IdEspèce
  LEFT  JOIN sous_espece       S ON P.IdSous_espèce = S.IdSous_espèce  
  INNER JOIN Genre             G ON G.IdGenre   = E.IdGenre 
  INNER JOIN Famille           F ON F.IdFamille = G.IdFamille 
WHERE 1=1
AND   P.IdPlante = :1
AND   A.Année_floraison = (SELECT MAX(tt.Année_floraison) 
                           FROM  Années_floraisons tt
                           WHERE tt.IdPlante = A.IdPlante);
__________________
Cordialement.
ORA-007 est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 25/10/2011, 14h45   #5
Invité régulier
 
Homme
Inscription : octobre 2011
Messages : 20
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Tourisme - Loisirs

Informations forums :
Inscription : octobre 2011
Messages : 20
Points : 8
Points : 8
Citation:
Envoyé par ORA-007 Voir le message
Bonjour,

Il ne faut pas melanger les 2 syntaxes.
Bonjour ORA et merci de t'intéresser aussi à mon problème

Effectivement, pour les syntaxes, j'avais un doute...
Mais je ne pensais que chaque jonction devait se rapporter directement à "FROM Plante", ce qui n'est pas le cas pour Genre et Famille et, donc, je ne voyais pas comment l'écrire


J'ai utilisé ta syntaxe (qui me semble correcte, d'après ce que j'ai pu apprendre aujourd'hui), mais j'ai droit à un beau message d'erreur :
Citation:
Erreur de syntaxe (opérateur absent) dans l'expression "A.IdPlante = P.IdPlante
INNER JOIN Espèce E ON E.IdEspèce = P.IdEspèce
LEFT JOIN sous_espece S ON P.IdSous_espèce = S.IdSous_espèce
INNER JOIN Genre G ON G.IdGenre = E.IdGenre
INNER JOIN Famille F ON F.IdFamille = G.IdFamill"
La succession de jointures ne plait pas à Access ?
Tevsox est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2011, 15h51   #6
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 446
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 446
Points : 7 547
Points : 7 547
Citation:
Envoyé par Tevsox Voir le message
La succession de jointures ne plait pas à Access ?
En effet, avec Access il faut encadrer chaque niveau de jointure avec des parenthèses.
Code :
1
2
3
4
5
6
7
SELECT ...
FROM         (((((Plante            P
  INNER JOIN Années_floraisons A ON A.IdPlante  = P.IdPlante)
  INNER JOIN Espèce            E ON E.IdEspèce  = P.IdEspèce)
  LEFT  JOIN sous_espece       S ON P.IdSous_espèce = S.IdSous_espèce ) 
  INNER JOIN Genre             G ON G.IdGenre   = E.IdGenre )
  INNER JOIN Famille           F ON F.IdFamille = G.IdFamille )
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 26/10/2011, 09h03   #7
Invité régulier
 
Homme
Inscription : octobre 2011
Messages : 20
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Tourisme - Loisirs

Informations forums :
Inscription : octobre 2011
Messages : 20
Points : 8
Points : 8
Salut al1_24 et merci pour l'histoire des parenthèses

Pour la sous-espèce, tout marche nickel. Je récupère exactement ce que je voulais. Merci à tous


Mais bon, comme, c'était trop facile (), j'ai eu un autre soucis...
Je ne m'étais pas aperçu que le champs "Année_floraison" aussi pouvait ne pas être rempli !
Un MAX... sur un champ potentiellement vide... pour jointer...

J'ai découvert qu'on pouvait jointer sur une requête et j'ai réussi à m'en sortir
Pour la petite histoire, ça donne ça :
Code :
1
2
3
4
5
6
7
8
SELECT P.IdPlante, P.Numero_collection, F.NomFamille, G.NomGenre, E.NomEspèce, S.NomSous_espèce, AF.Année_max
FROM         (((((Plante            P
  INNER JOIN Espèce            E ON E.IdEspèce  = P.IdEspèce)
  LEFT  JOIN Sous_espèce       S ON P.IdSous_espèce = S.IdSous_espèce)
  INNER JOIN Genre             G ON G.IdGenre   = E.IdGenre)
  INNER JOIN Famille           F ON F.IdFamille = G.IdFamille)
  LEFT JOIN (SELECT IdPlante, MAX(A.Année_floraison) AS Année_max FROM Années_floraisons A WHERE A.IdPlante = ... GROUP BY IdPlante) AF ON AF.IdPlante = P.IdPlante)
WHERE P.IdPlante = ...;

Grand merci à tous
Tevsox est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h15.


 
 
 
 
Partenaires

Hébergement Web