Vous n'êtes pas identifié(e).
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
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
http://blog-postgresql.verite.pro/
Hors ligne
Merci beaucoup pour votre explication très clair.
Pourriez vous m'indiquer comment l'écrire en LEFT JOIN?
Merci
Hors ligne
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
http://blog-postgresql.verite.pro/
Hors ligne
Merci beaucoup, cela fonctionne
Vous me rendez un grand service
Hors ligne