Partage
  • Partager sur Facebook
  • Partager sur Twitter

Synthaxe d'une jointure

    12 mars 2019 à 15:26:43

    Bonjour à tous.

    Je dois suis en train d'examiner une requête à plusieurs jointures, qu'on m'a proposé, dans PostGre sql

     La voici:

    SELECT cit.id_citation, esp.nom_s, esp.nom_f, date_observation, 
      COALESCE(pt.the_geom, ln.the_geom, pol.the_geom) AS the_geom
    FROM citations cit
    JOIN observations o ON cit.id_observation = o.id_observation
    JOIN especes esp ON cit.id_espece = esp.id_espece
    JOIN espace_point pt ON o.espace_table = 'espace_point' AND pt.id_espace = o.id_espace
    JOIN espace_line ln ON o.espace_table = 'espace_line' AND ln.id_espace = o.id_espace
    JOIN espace_polygon pol ON o.espace_table = 'espace_polygon' AND pol.id_espace = o.id_espace
    WHERE nom_s ILIKE 'Rana%' AND date_observation > '2018-01-01'
    LIMIT 20;

    Mon problème se situe au niveau des lignes 6, 7 et 8.

    Je ne comprends pas la syntaxe de ces lignes. Par exemple, sur o.espace_table = 'espace_point' : pourquoi y a t-il une égalité entre une colonne et une expression entre parenthèse?

    Et pourquoi ajouter une nouvelle jointure après cela?

    Je précise que la requête fonctionne mais ne renvoie aucune donnée (ce qui ne devrait pas arriver).

    -
    Edité par Cro-Magnon 12 mars 2019 à 15:34:29

    • Partager sur Facebook
    • Partager sur Twitter
      12 mars 2019 à 16:04:04

      Bonjour,

      Cro-Magnon a écrit:

      la requête fonctionne mais ne renvoie aucune donnée (ce qui ne devrait pas arriver)

      Ce n'est pas parce qu'il n'y a pas d'erreur qu'elle fonctionne ... C'est le résultat qui détermine cela ... Donc elle ne fonctionne pas :p

      Cro-Magnon a écrit:

      une requête à plusieurs jointures, qu'on m'a proposé

      Qui t'a proposé cela ?

      Sans connaître ton modèle, je dirais qu'une observation ne peut pas être un point, une ligne et un polygone en même temps ... l'utilisation de COALESCE semble donc nécessaire, seulement il faudrait la coupler avec des jointures externes ...

      Sans plus d'information, je ferai "simplement" :

      SELECT
      	cit.id_citation,
      	esp.nom_s,
      	esp.nom_f,
      	date_observation,
      	COALESCE(pt.the_geom, ln.the_geom, pol.the_geom) AS the_geom
      FROM
      	citations cit
      		INNER JOIN observations o
      			ON cit.id_observation = o.id_observation
      		INNER JOIN especes esp
      			ON cit.id_espece = esp.id_espece
      		LEFT JOIN espace_point pt
      			ON pt.id_espace = o.id_espace
      		LEFT JOIN espace_line ln
      			ON ln.id_espace = o.id_espace
      		LEFT JOIN espace_polygon pol
      			ON pol.id_espace = o.id_espace
      WHERE
      	nom_s ILIKE 'Rana%'
      	AND date_observation > '2018-01-01'
      LIMIT 20;
      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        12 mars 2019 à 16:32:12

        Tu as bien compris quel était le propos de la requête. Il s'agit d'interroger la base de données pour connaître la répartition géographique d'espèces animales (je ne l'ai pas précisé pour ne pas alourdir mon post).

        J'ai essayé ta syntaxe et elle n'a pas fonctionné, malheureusement... Le problème vient peut-être d'ailleurs. Mais si j'exécute la requête en me débarrassant des lignes 6, 7, 8 (avec les identifiants, noms et dates d'observation seulement), j'obtiens mes données, comme il se doit

        J'admets ne pas comprendre la syntaxe de ces trois lignes.

        Au fait, à quoi te sert la jointure externe? Je suppose que c'est à cause du fait qu'une observation sera faite soit sous forme de point, de ligne, ou de polygone.

        EDIT: CA FONCTIONNE. Au temps pour moi :-). Ma question persiste cependant sur la syntaxe des lignes.

        Un grand merci! J'admets que ce n'était pas évident de comprendre le problème.

        -
        Edité par Cro-Magnon 12 mars 2019 à 16:39:15

        • Partager sur Facebook
        • Partager sur Twitter
          12 mars 2019 à 16:58:54

          Dans ta requête de départ, tu as trois jointures internes (JOIN simple) qui rendent "obligatoire" la jointure. Il faut donc qu'une observation soit liée aux 3 tables pour qu'elle ressorte, ce qui est impossible puisqu'une observation ne peut pas être un point, une ligne et un polygone en même temps ...

          En utilisant une jointure externe (LEFT JOIN dans ce cas) on rend la jointure "facultative". Qu'une observation soit liée à une des 3 tables ou non, elle ressortira ...

          Pour ta question de départ, le fait de mettre des conditions de jointure directement avec une valeur (et non pas entre 2 colonnes) n'est pas conseillé ... ces égalités devraient se trouver dans la clause WHERE, sauf dans le cas des jointures externes, car dans ce cas, mettre une condition dans la clause WHERE sur une table en jointure externe annule l'effet "facultatif" et transforme implicitement la jointure externe en jointure interne.

          Après dans cet exemple précis, on se fout de tester la valeur de la colonne observation.espace_table, puisque c'est la  jointure qui assure cela.

          Je te conseille de (re)lire ton cours SQL sur les jointures ...

          -
          Edité par Benzouye 12 mars 2019 à 17:01:37

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            13 mars 2019 à 10:36:58

            Ok, Merci pour les conseils. A bientôt
            • Partager sur Facebook
            • Partager sur Twitter

            Synthaxe d'une jointure

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown