#1 Fri 03 April 2020 18:18
- ODJAC33
- Participant assidu
- Date d'inscription: 6 Aug 2017
- Messages: 240
QGIS: Lien entre 2 tables pour selection
Bonjour à tous,
Je voudrais sélectionner des éléments d'une table T1 (comprenant 6 objets) suivant des valeurs de champs d'une autre table T2 (comprenant 4 objets). Ce sont des segments de routes aériennes.
Prenons un exemple très concret pour bien illustrer mon problème.
Ma table T1 comprend le champ Flux, dont les valeurs pour les 6 objets de la table, numérotés (o1), (o2), (o3), (o4) , (o5) et (o6), sont :
- pour (o1) : UMOXA-EBOMO,
- pour (o2) : UMOXA-BADUR,
- pour (o3) : UMOXA-FEJAC,
- pour (o4) : EBOMO-BADUR,
- pour (o5) : EBOMO-FEJAC
- pour (o6) : BADUR-FEJAC.
Ma table T2 comprend 3 champs (Flux1 , Flux2 et Flux3 ) dont les valeurs pour les 4 objets de la table, numérotés (o'1), (o'2), (o'3) et (o'4), sont : :
- Flux1 : UMOXA-EBOMO pour l'objet (o'1) et UMOXA-BADUR pour l'objet (o'2)
- Flux2 : EBOMO-BADUR pour l'objet (o'3)
- Flux3 : BADUR-FEJAC pour l'objet (o'4)
Je souhaiterais sélectionner dans la table T1 uniquement les 4 objets que l'on retrouve dans la table T2. Il s'agira donc des objets : (o1), (o2) , (o4) et (o6)) .
J'ai fait plein d'essais non concluants car je n'arrive pas à faire une jointure propre entre les 2 tables (dont la structure, je vous l'accorde, n'est pas la même, ce qui explique certainement le problème).
Que me conseilleriez-vous?
A titre info mes 2 bases comprennent beaucoup plus d'objets, mais, déjà, si j'arrive à résoudre le problème énoncé ci-dessus, je pourrai appliquer la solution à des bases nettement plus grandes.
Merci d'avance.
Hors ligne
#2 Fri 03 April 2020 19:27
- carteq
- Participant assidu
- Date d'inscription: 8 Mar 2008
- Messages: 829
Re: QGIS: Lien entre 2 tables pour selection
Select * from [TableA] where [Flux] in
(Select [Flux1] from [TableB] where [Flux1] <> ""
Union
Select [Flux2] from [TableB] where [Flux2] <> ""
Union
Select [Flux3] from [TableB] where [Flux3] <> "")
Hors ligne
#3 Sat 04 April 2020 17:44
- ODJAC33
- Participant assidu
- Date d'inscription: 6 Aug 2017
- Messages: 240
Re: QGIS: Lien entre 2 tables pour selection
Merci beaucoup, c'est vrai que je raisonne beaucoup plus en jointures de tables au lieu d'effectuer des requêtes SQL, nettement plus efficaces et puissantes.
J'ai trouvé 329 objets après avoir exécuté ma requête au lieu de 490, mais je vais regarder cela de plus près pour savoir d'où vient cette erreur.
Petite question, y a t'il un moyen d'apprendre simplement et rapidement les bases du SQL?
Le constructeur de requêtes de QGIS m'a l'air bien fait, mais, sans les bases, ....
Encore merci à vous.
Hors ligne
#4 Sat 04 April 2020 19:11
- carteq
- Participant assidu
- Date d'inscription: 8 Mar 2008
- Messages: 829
Re: QGIS: Lien entre 2 tables pour selection
J'ai appris avec ce livre :
https://www.amazon.ca/SQL-Queries-Mere- … amp;sr=8-1
Ça couvre le non-spatial. C'est en anglais. Ajouter le spatial ensuite est assez simple. Les fonctions de SpatiaLite sont ici :
http://www.gaia-gis.it/gaia-sins/spatia … 4.2.0.html
Hors ligne
#5 Sun 05 April 2020 11:02
- ODJAC33
- Participant assidu
- Date d'inscription: 6 Aug 2017
- Messages: 240
Re: QGIS: Lien entre 2 tables pour selection
OK, merci, je vais explorer cela.
J'ai trouvé mon erreur, la différence était due que j'avais des doublons dans l'une de mes tables.
Donc votre requête fonctionne parfaitement, encore merci.
Hors ligne
#6 Sun 05 April 2020 11:51
- GeoSignature
- Participant occasionnel
- Lieu: Saint-Pierre-des-Nids
- Date d'inscription: 12 Nov 2019
- Messages: 34
Re: QGIS: Lien entre 2 tables pour selection
Petite question, y a t'il un moyen d'apprendre simplement et rapidement les bases du SQL?
Pour apprendre le SQL, je trouve ce site très complet :
https://sql.sh/
(1er résultat du moteur de recherche G**gle avec "sql" )
Ensuite, si vous avez des questions spécifiques, non spatiales (si c'est spatial, vous pouvez poster ici dans la rubrique BDD), vous pouvez les poser sur le Forum Developpez, rubrique SQL : https://www.developpez.net/forums/f37/b … ngage-sql/
Hors ligne
#7 Tue 07 April 2020 15:23
- ODJAC33
- Participant assidu
- Date d'inscription: 6 Aug 2017
- Messages: 240
Re: QGIS: Lien entre 2 tables pour selection
OK merci beaucoup Sylvain.
Hors ligne
#8 Fri 24 April 2020 16:53
- ODJAC33
- Participant assidu
- Date d'inscription: 6 Aug 2017
- Messages: 240
Re: QGIS: Lien entre 2 tables pour selection
Bonjour Sylvain, bonjour à tous,
Suite au échanges ci-dessous, je m'entraine dès que j'ai un peu de temps à faire des requêtes SQL.
Je bloque un peu sur les requêtes spatiales.
Je cherche tout simplement à ajouter une colonne X et une colonne Y à une base de données appelée eTodL93.
La géométrie de cette base est contenue dans un champs wkt_geom qui n'est pas visible dans la table attributaire (je fais un copier-coller de la table attributaire vers Excel pour le voir).
Lorsque je lance la requête :
SELECT *, ST_X(wkt_geom) AS X,
ST_Y(wkt_geom) AS Y FROM eTodL93
J'ai une erreur de syntaxe et il me dit qu'il ne connait pas la colonne wkt_geom.
et si je lance la requête :
SELECT *, ST_X(geometry) AS X,
ST_Y(geometry) AS Y FROM eTodL93
Il ne me renvoie que des valeurs NULL pour X et pour Y.
Merci de vos conseils.
Hors ligne
#9 Fri 24 April 2020 20:01
- carteq
- Participant assidu
- Date d'inscription: 8 Mar 2008
- Messages: 829
Re: QGIS: Lien entre 2 tables pour selection
Il faut vraiment spécifier tu travailles à partir de quoi : couche virtuelle, BD SQlite, Geopackage. Merci.
Tu peux voir la colonne géométrie dans le BD Manager, onglet info.
Hors ligne
#10 Sat 25 April 2020 11:41
- ODJAC33
- Participant assidu
- Date d'inscription: 6 Aug 2017
- Messages: 240
Re: QGIS: Lien entre 2 tables pour selection
C'est une couche virtuelle et le champ geometry est bien apparent dans l'onglet Infos.
Et pourtant la requête :
SELECT *, ST_X(geometry) AS X,
ST_Y(geometry) AS Y FROM eTodL93
Me renvoie des valeurs NULL pour X et Y.
La copie d'écran ci-jointe te donnera des informations complémentaires.
Merci encore.
Hors ligne
#11 Sat 25 April 2020 18:06
- carteq
- Participant assidu
- Date d'inscription: 8 Mar 2008
- Messages: 829
Re: QGIS: Lien entre 2 tables pour selection
J'ai testé sur un shapefile importé, aucun problème.
Hors ligne
#12 Sun 26 April 2020 11:50
- ODJAC33
- Participant assidu
- Date d'inscription: 6 Aug 2017
- Messages: 240
Re: QGIS: Lien entre 2 tables pour selection
Peux-tu voir ce que ça donne sur l'extrait ci-joint stp car je me retrouve toujours avec des valeurs NULL pour X et Y.
A titre info, la base de données contient bien un attribut geometry, mais je ne sais pas ce que contient ce champ (je ne le vois pas dans la table attributaire).
Je retrouve la géométrie des points dans l'attribut wkt_geom (non visible également dans la table attributaire mais visible par copier-coller de la table attributaire dans Excel) qui, pour le premier point, vaut (un nombre de décimales énorme, bizarre!):
PointZ (333097.46300014993175864 6273815.70800260547548532 73.76800000000000068)
Hors ligne
#13 Sun 26 April 2020 16:18
- carteq
- Participant assidu
- Date d'inscription: 8 Mar 2008
- Messages: 829
Re: QGIS: Lien entre 2 tables pour selection
Le DB Manager m'indique que ce n'est pas une table spatiale. Le Format Point25D n'est peut-être pas supporté. Le fait d'avoir 2 colonnes géométrie est peut-être confondant aussi.
(un nombre de décimales énorme, bizarre!):
PointZ (333097.46300014993175864 6273815.70800260547548532 73.76800000000000068)
333097.46300014993175864 = x
6273815.70800260547548532 = y
73.76800000000000068 = z
Hors ligne
#14 Sun 26 April 2020 17:42
- ODJAC33
- Participant assidu
- Date d'inscription: 6 Aug 2017
- Messages: 240
Re: QGIS: Lien entre 2 tables pour selection
Oui, chaque point est représenté par son x, y et z en PointZ.
Du coup, je ne peux avoir accès à aucune extension spatiale SQL avec ce type de géométrie?
Quel type de transformation dois-je faire pour que le DBManager reconnaisse cette table comme une table spatiale?
Merci.
Hors ligne
#15 Sun 26 April 2020 19:04
- ODJAC33
- Participant assidu
- Date d'inscription: 6 Aug 2017
- Messages: 240
Re: QGIS: Lien entre 2 tables pour selection
J'ai trouvé une méthode, je ne sais pas ce qu'elle vaut, mais au moins elle marche : j'ai exporté ma couche au format SpatialLite.
Hors ligne
#16 Mon 27 April 2020 01:10
- carteq
- Participant assidu
- Date d'inscription: 8 Mar 2008
- Messages: 829
Re: QGIS: Lien entre 2 tables pour selection
Le moteur SQL du BD Manager est celui de SQLite/SpatiaLite
Hors ligne
#17 Sun 03 May 2020 18:53
- ODJAC33
- Participant assidu
- Date d'inscription: 6 Aug 2017
- Messages: 240
Re: QGIS: Lien entre 2 tables pour selection
OK, merci.
Je progresse à mon rythme en SQL. J'ai un nouveau blocage.
La commande suivante (changement de l'altitude de l'objet d'identifiant 064BZ000386 de la couche virtuelle ExtraitTODSQL au format SQLITE) :
UPDATE ExtraitTODSQL
SET elevation = '102'
WHERE VSDesigna ='064BZ000594'
Me renvoie l'erreur de syntaxe suivante :
1 - near "UPDATE": syntax error
Hors ligne
#18 Sun 03 May 2020 19:01
- ODJAC33
- Participant assidu
- Date d'inscription: 6 Aug 2017
- Messages: 240
Re: QGIS: Lien entre 2 tables pour selection
Objet d'identifiant 064BZ000594
Hors ligne
#19 Mon 04 May 2020 14:11
- carteq
- Participant assidu
- Date d'inscription: 8 Mar 2008
- Messages: 829
Re: QGIS: Lien entre 2 tables pour selection
L'élévation ne nécessite pas de guillemets si c'est un nombre.
Hors ligne
#20 Mon 04 May 2020 18:43
- ODJAC33
- Participant assidu
- Date d'inscription: 6 Aug 2017
- Messages: 240
Re: QGIS: Lien entre 2 tables pour selection
C'est un double (Type reconnu Real), mais, même sans les guillemets, j'ai la même erreur de syntaxe.
Je vous joins la table (si vous avez le temps de tester cette petite mise à jour).
Merci beaucoup.
Hors ligne
#21 Wed 06 May 2020 01:47
- carteq
- Participant assidu
- Date d'inscription: 8 Mar 2008
- Messages: 829
Re: QGIS: Lien entre 2 tables pour selection
Votre extrait de fichier n'est pas valide selon QGIS 3.8
Hors ligne
#22 Sat 09 May 2020 12:21
- ODJAC33
- Participant assidu
- Date d'inscription: 6 Aug 2017
- Messages: 240
Re: QGIS: Lien entre 2 tables pour selection
J'utilise QGIS 3.4 et QGIS 3.12.
QGIS 3.4 reconnait cette couche comme une couche SpatiaLite et QGIS 3.12 (tout comme pour vous avec QGIS 3.8) ne la reconnait pas comme une couche SpatialLite.
Pourtant, avec QGIS 3.12, j'ai fait un test avec la requête très simple ci-dessous qui a très bien fonctionné.
SELECT * FROM ExtraitTODSQL WHERE elevation>70
Par contre, la requête UPDATE ExtraitTODSQL SET elevation = ‘102’ WHERE VSDesigna ='064BZ000594' me renvoie toujours le même message d'erreur : - near "UPDATE": syntax error que ce soit avec QGIS 3.12 ou QGIS 3.4.
Étrange tout cela ...
Merci encore.
Hors ligne
#23 Sat 09 May 2020 13:50
- carteq
- Participant assidu
- Date d'inscription: 8 Mar 2008
- Messages: 829
Re: QGIS: Lien entre 2 tables pour selection
Mon avis : SQLite et Spatialite, c'est pas terrible comparé à toutes les autres solutions. Je n'ai jamais eu de situations de ce genre avec un autre produit.
Travailler avec PostGIS est sûrement mieux, dans le domaine libre.
Dans les solution commerciales, pendant la présente crise sanitaire, Manifold 8 est en vente à 95$ US. (la version 9 aussi, mais je ne vous recommande pas cet excellent produit, car beaucoup trop complexe pour apprendre). La version 8 permet d'écrire du SQL, spatial ou non, sans limite. Et sans installer de SGBD. C'est mon outil pour le SQL depuis plus d'une décennie. (manifold.net)
Hors ligne