Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#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
http://blog-postgresql.verite.pro/
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
http://blog-postgresql.verite.pro/
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