PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 11/07/2017 14:41:09

jydee
Membre

Requête qui ne me donne pas toutes les lignes de ma table

Voici ma requete

Code :

CREATE TABLE IF NOT EXISTS
france_metropolitaine_ed17.n_pne_bati_indifferencie_adresse_s_v2
AS

SELECT
   n_bdt_bati_indifferencie_s_000.prec_plani ,
   n_bdt_bati_indifferencie_s_000.prec_alti ,
   n_bdt_bati_indifferencie_s_000.origin_bat ,
   n_bdt_bati_indifferencie_s_000.hauteur ,
   n_bdt_bati_indifferencie_s_000.z_min ,
   n_bdt_bati_indifferencie_s_000.z_max ,
   n_bdt_bati_indifferencie_s_000.nature ,

   n_apr_bati_l_000.surf_bat,
   n_apr_bati_l_000.type_bat,

   n_apr_adresse_p_000.id as id_adr ,
   n_apr_adresse_p_000.id_tr ,
   n_apr_adresse_p_000.methode,
   n_apr_adresse_p_000.numero ,
   n_apr_adresse_p_000.rep ,
   n_apr_adresse_p_000.compl ,
   n_apr_adresse_p_000.nom_voie ,
   n_apr_adresse_p_000.alias ,
   n_apr_adresse_p_000.nom_ld ,
   n_apr_adresse_p_000.code_insee ,
   n_apr_adresse_p_000.code_post ,
   n_apr_adresse_p_000.type_loc ,
   n_apr_adresse_p_000.cote,

   n_apr_bati_l_000.geom

FROM
n_apr_adresse_p_000,
n_bdt_bati_indifferencie_s_000 LEFT JOIN n_apr_bati_l_000 ON
n_bdt_bati_indifferencie_s_000.id = n_apr_bati_l_000.id_bat

WHERE
n_apr_adresse_p_000.id = n_apr_bati_l_000.id_adr

;


avec

-- Table: n_apr_bati_l_000

-- DROP TABLE n_apr_bati_l_000;

CREATE TABLE n_apr_bati_l_000
(
  gid integer,
  id character varying(24),
  insee_com character varying(5),
  id_adr character varying(24),
  id_bat character varying(24),
  type_lien character varying(20),
  nb_adr smallint,
  nb_bati smallint,
  origin_bat character varying(8),
  type_bat character varying(25),
  surf_bat numeric,
  haut_bat smallint,
  z_min_bat double precision,
  z_max_bat double precision,
  geom geometry(MultiLineString)
)


-- Table: n_apr_adresse_p_000

-- DROP TABLE n_apr_adresse_p_000;

CREATE TABLE n_apr_adresse_p_000
(
  id character varying(24),
  id_tr character varying(24),
  methode character varying(13),
  numero smallint,
  rep character varying(9),
  compl character varying(70),
  nom_voie character varying(70),
  alias character varying(70),
  nom_ld character varying(70),
  code_insee character varying(5),
  code_post character varying(5),
  type_loc character varying(16),
  cote character varying(6),
  geom geometry(MultiLineString)


-- Table: n_bdt_bati_indifferencie_s_000

-- DROP TABLE n_bdt_bati_indifferencie_s_000;

CREATE TABLE n_bdt_bati_indifferencie_s_000
(
  id character varying(24),
  prec_plani numeric(6,1),
  prec_alti numeric(7,1),
  origin_bat character varying(8),
  hauteur smallint,
  z_min numeric(8,2),
  z_max numeric(8,2),
  geom geometry(Geometry,2154)
)




J'ai un souci au niveau du résultat de ma requête : je n'ai pas pas tous les id de n_bdt_bati_indifferencie_s_000 (n_bdt_bati_indifferencie_s_000.id)
Je voudrais avoir toutes les lignes de la colonne id de la table (n_bdt_bati_indifferencie_s_000) et cette table serait complétée par la table n_apr_bati_l_000 quand il y a des données avec le même ID (n_bdt_bati_indifferencie_s_000.id = n_apr_bati_l_000.id_bat)
Ma jointure à gauche est certainement fausse mais comment l'écrire?

Merci beaucoup

Hors ligne

#2 11/07/2017 16:10:10

dverite
Membre

Re : Requête qui ne me donne pas toutes les lignes de ma table

Ce bout de requête:


   n_bdt_bati_indifferencie_s_000 LEFT JOIN n_apr_bati_l_000 ON n_bdt_bati_indifferencie_s_000.id = n_apr_bati_l_000.id_bat


dit de mettre des colonnes nulles à la place de celles de n_apr_bati_l_000 pour les lignes de  n_bdt_bati_indifferencie_s_000  où la condition de jointure n'est pas satisfaite. Ca va donc créer entre autres des  n_apr_bati_l_000.id_adr à NULL


Mais cette condition là:

  WHERE n_apr_adresse_p_000.id = n_apr_bati_l_000.id_adr


implique que les lignes en question vont être filtrées parce n_apr_adresse_p_000.id  = NULL va être toujours NULL, donc négatif pour un WHERE.


Généralement la solution est de combiner toutes les tables en LEFT JOIN, au lieu de seulement 2 sur 3 ici.


@DanielVerite

Hors ligne

#3 13/07/2017 10:56:36

jydee
Membre

Re : Requête qui ne me donne pas toutes les lignes de ma table

Merci beaucoup pour votre explication très clair.
Pourriez vous m'indiquer comment l'écrire en LEFT JOIN?

Merci

Hors ligne

#4 13/07/2017 11:42:01

dverite
Membre

Re : Requête qui ne me donne pas toutes les lignes de ma table

ce serait du genre

 FROM
n_bdt_bati_indifferencie_s_000 LEFT JOIN n_apr_bati_l_000 
    ON (n_bdt_bati_indifferencie_s_000.id = n_apr_bati_l_000.id_bat)
LEFT JOIN n_apr_adresse_p_000 
    ON (n_apr_adresse_p_000.id = n_apr_bati_l_000.id_adr)

@DanielVerite

Hors ligne

#5 13/07/2017 17:43:19

jydee
Membre

Re : Requête qui ne me donne pas toutes les lignes de ma table

Merci beaucoup, cela fonctionne
Vous me rendez un grand service

Hors ligne

Pied de page des forums