Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Suite à un problème technique intervenu entre le 22 et le 23 mars, nous avons du procéder dans la soirée du 25 mars, à la restauration de la base de données du 24 mars (matinée).

En clair, nous avons perdu vos contributions et inscriptions du dimanche 24 et du lundi 25 mars.
Nous vous prions de nous excuser.

#1 Thu 13 September 2018 16:49

Sylvain PIERRE
Participant assidu
Lieu: Strasbourg
Date d'inscription: 6 Sep 2005
Messages: 170

QGIS 2.18: DB Manager sql WITH clause inopérante

Bonjour,
J'avais déjà été confronté au problème, mais du coup écris mes requêtes plus classiquement.
Je reviens dessus, car la clause WITH permet vraiment de bien découper les requêtes complexes.

Mes données sont dans un fichier gpkg. Une table pour le parcellaire, une table pour les propriétaires.

Le problème : ma requête s’exécute correctement et affiche le résultat attendu dans le gestionnaire, là ou ça se complique c’est lorsque je veux charger le résultat en tant que nouvelle couche : ce n’est plus du tout le bon contenu qui est chargé mais la table de mes parcelles cadastrales de départ !

La requête, même si ça n'apporte pas grand chose vu qu'elle fonctionne:

Code:

WITH foncier as(SELECT p.dnupro, 
    CASE
        WHEN p.dlign6 in ('67440 THAL-MARMOUTIER', '67700 HAEGEN','67440 MARMOUTIER','67440 REINHARDSMUNSTER') THEN 'Thal et environs'
        WHEN p.dlign6 like '67%' THEN 'Bas-Rhin'
        ELSE 'Hors département'
    END AS situation,
    Count(p.idu) cpt_pro, p.idu
    FROM proprietaires p
    GROUP BY p.dnupro, situation, idu), 
    p_t as(
        SELECT DISTINCT f1.dnupro, f2.situation, f1.idu
            FROM foncier f1
        JOIN foncier f2 ON f1.dnupro = f2.dnupro
        WHERE f2.situation = 'Thal et environs'), 
    p_d as(
    SELECT DISTINCT f1.dnupro, f2.situation, f1.idu
        FROM foncier f1
        JOIN foncier f2 ON f1.dnupro = f2.dnupro
    WHERE f2.situation = 'Bas-Rhin'), 
    p_h as(
    SELECT distinct f1.dnupro, f2.situation, f1.idu
    FROM foncier f1
    JOIN foncier f2 ON f1.dnupro = f2.dnupro
    WHERE f2.situation = 'Hors département'), 
    p_d_t as (
    SELECT * FROM p_t
        UNION 
        SELECT * from p_d
        WHERE not exists (SELECT 1 FROM p_t WHERE p_t.dnupro = p_d.dnupro))

    SELECT * FROM p_d_t
    UNION
    SELECT * FROM p_h
        WHERE not exists (SELECT 1 FROM p_d_t WHERE p_d_t.dnupro = p_h.dnupro)

Ca pourrait être plus simple, mais le gestionnaire ne prends pas en compte les OUTER JOIN...

Si personne n'a d'idées je vais la réécrire en mode classique, mais ça fait un peu c...

Sylvain

Dernière modification par Sylvain PIERRE (Thu 13 September 2018 17:06)


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#2 Fri 14 September 2018 10:57

SANTANNA
Moderateur
Lieu: Angers
Date d'inscription: 18 Jan 2008
Messages: 3790

Re: QGIS 2.18: DB Manager sql WITH clause inopérante

Bonjour,
Et en ajoutant un champ integer autoincrémenté (qui servirait de clé primaire) à la table en sortie?

En ligne

 

Pied de page des forums

Powered by FluxBB