Sql "WHERE NOT IN"

classic Classic list List threaded Threaded
19 messages Options
Reply | Threaded
Open this post in threaded view
|

Sql "WHERE NOT IN"

Nicolas F.
Administrator
Bonjour

Je recontre un problème avec une requête Sql et l'erreur ne me dit pas grand chose.

J'ai deux tables. grid_all qui contient tout les indices et grid_excl qui contient une partie des indices de grid_all.

Je veux créer une table grid_n qui contient les indices de grid_all qui ne sont pas dans grid_excl.

Je fait donc (peut être pas très optimisé) :

CREATE TABLE  grid_n AS SELECT ga.* FROM grid_all as ga WHERE ga.ID NOT IN (SELECT ID FROM grid_excl);

L'erreur en retour est
Index: 0, Size: 0
Caused by: Index: 0, Size: 0

merci

Reply | Threaded
Open this post in threaded view
|

Re: Sql "WHERE NOT IN"

Gwendall Petit
Administrator
Bonjour Nicolas,

Malheureusement, cette fonctionnalité n'est pas encore implémentée dans OrbisGIS.

En attendant, il reste PostGIS ...

Gwendall Petit
Équipe OrbisGIS
Reply | Threaded
Open this post in threaded view
|

Re: Sql "WHERE NOT IN"

Nicolas F.
Administrator
PostGis ?

Mais même si cette requête n'est pas possible. Il y a peut être moyen de trouver un autre genre de requête sql compatible orbisgis qui ferait l'opération recherché ?
Reply | Threaded
Open this post in threaded view
|

Re: Sql "WHERE NOT IN"

Gwendall Petit
Administrator
J'ai déjà rencontré ce problème dans le cadre de mon travail. J'ai réussi à le résoudre avec PostgreSQL / PostGIS.

Voici un exemple de requête que j'ai fait
update point_appart_result set parcelle = 1 where num_acte in (select a.num_acte from point_appart_result as a, parc_dgi as b where st_contains(b.the_geom,a.the_geom));
 
Pour ce qui est de trouver une alternative "SQL OrbisGIS" compatible ... je suis preneur pour toute bonne idée !

Gwendall
Reply | Threaded
Open this post in threaded view
|

Re: Sql "WHERE NOT IN"

Alexis.G
Bonjour !

Où peut-on trouver une référence précise des fonctions SQL gérées par
GDMS ? C'est pour voir si je peux construire une parade avec ces
fonctions.

Merci d'avance ;-)

Alexis.

2010/6/2 Gwendall Petit [via OrbisGIS]
<[hidden email]>:

> J'ai déjà rencontré ce problème dans le cadre de mon travail. J'ai réussi à
> le résoudre avec PostgreSQL / PostGIS.
>
> Voici un exemple de requête que j'ai fait
>
> update point_appart_result set parcelle = 1 where num_acte in (select
> a.num_acte from point_appart_result as a, parc_dgi as b where
> st_contains(b.the_geom,a.the_geom));
>
>
> Pour ce qui est de trouver une alternative "SQL OrbisGIS" compatible ... je
> suis preneur pour toute bonne idée !
>
> Gwendall
>
> ________________________________
> View message @
> http://orbisgis.3871844.n2.nabble.com/Sql-WHERE-NOT-IN-tp5129912p5130497.html
> To unsubscribe from OrbisGIS, click here.
>



--
Les objets quantiques sont complètement dingues, mais au moins ils le
sont tous de la même façon.
Reply | Threaded
Open this post in threaded view
|

Re: Sql "WHERE NOT IN"

Gwendall Petit
Administrator
Bonjour Alexis,

La liste n'existe pas encore (en attendant il faut se baser sur cette liste)
On va préparer ça ... dans les plus brefs délais !
Reply | Threaded
Open this post in threaded view
|

Re: Sql "WHERE NOT IN"

Gwendall Petit
Administrator
Vous trouverez une description de la grammaire SQL de GDMS ICI (accessible aussi via le site d'OrbisGIS)

En espérant que ça aide ...

Cordialement,

Gwendall
Reply | Threaded
Open this post in threaded view
|

Re: Sql "WHERE NOT IN"

Alexis.G
Tu es mon dieu, Gwendall, merci :) J'ai du passer à côté sur le site
^_^ Java attaque l'acuité visuelle ;-)
Reply | Threaded
Open this post in threaded view
|

Re: Sql "WHERE NOT IN"

Gwendall Petit
Administrator
Non, tu as une bonne vue ...
Je viens de la mettre à disposition il y a 10min .... juste pour toi  
Reply | Threaded
Open this post in threaded view
|

Re: Sql "WHERE NOT IN"

Alexis.G
Du coup je vais pas voir mon ophtalmo ^_^
Merci encore ;-)
Reply | Threaded
Open this post in threaded view
|

Re: Sql "WHERE NOT IN"

Alexis.G
In reply to this post by Gwendall Petit
Je suis désolé pour le double post, j'espère que vous me pardonnerez.
J'ai une proposition (que je n'écris pas en SQL, vous êtes meilleurs
que moi pour ça, et j'ai pas le contenu pour tester ;) ) pour
contourner le problème évoqué.
Le NOT IN que tu veux faire, Nicolas, revient à copier la table où
sont toutes les informations, grid_all, et à supprimer celles qui sont
dans grid_excl.

Donc tu dois pouvoir faire un CREATE_TABLE en reprenant toutes les
entrées de grid_all, et ensuite un DELETE de tes indices, en les
cherchant dans grid_excl.

Je fais un peu de spéculation sur les fonctions du DELETE. Mon prof de
base de données serait un peu mécontent de ma mauvaise mémoire ^_^

sur le principe, je pense que ça marche. Même si c'est un peu sale.

Bon courage ;-)

Alexis.

--
Les objets quantiques sont complètement dingues, mais au moins ils le
sont tous de la même façon.
Reply | Threaded
Open this post in threaded view
|

Re: Sql "WHERE NOT IN"

Gwendall Petit
Administrator
Je suis désolé pour le double post, j'espère que vous me pardonnerez.
Pas de soucis
Le NOT IN que tu veux faire, Nicolas, revient à copier la table où sont toutes les informations, grid_all, et à supprimer celles qui sont dans grid_excl.

Donc tu dois pouvoir faire un CREATE_TABLE en reprenant toutes les entrées de grid_all, et ensuite un DELETE de tes indices, en les cherchant dans grid_excl.
La logique est là, mais sauf erreur de ma part, il va falloir faire un "DELETE where my_value in my_table ..."
C'est donc le serpent qui se mord la queue. Il se peut que ça fonctionne ... mais au mieux je pense que ça va faire chauffer OrbisGIS.
Nicolas, un avis ?
Je fais un peu de spéculation sur les fonctions du DELETE. Mon prof de base de données serait un peu mécontent de ma mauvaise mémoire ^_^
Je fais de ce pas une copie de ton mail à J-Y. :-)

Gwendall
Reply | Threaded
Open this post in threaded view
|

Re: Sql "WHERE NOT IN"

Alexis.G
2010/6/2 Gwendall Petit [via OrbisGIS]
<[hidden email]>:

> Je suis désolé pour le double post, j'espère que vous me pardonnerez.
>
> Pas de soucis
>
> Le NOT IN que tu veux faire, Nicolas, revient à copier la table où sont
> toutes les informations, grid_all, et à supprimer celles qui sont dans
> grid_excl.
>
> Donc tu dois pouvoir faire un CREATE_TABLE en reprenant toutes les entrées
> de grid_all, et ensuite un DELETE de tes indices, en les cherchant dans
> grid_excl.
>
> La logique est là, mais sauf erreur de ma part, il va falloir faire un
> "DELETE where my_value in my_table ..."
> C'est donc le serpent qui se mord la queue. Il se peut que ça fonctionne ...
> mais au mieux je pense que ça va faire chauffer OrbisGIS.
> Nicolas, un avis ?
>
> Je fais un peu de spéculation sur les fonctions du DELETE. Mon prof de base
> de données serait un peu mécontent de ma mauvaise mémoire ^_^
>
> Je fais de ce pas une copie de ton mail à J-Y. :-)
>
> Gwendall
>
> ________________________________
> View message @
> http://orbisgis.3871844.n2.nabble.com/Sql-WHERE-NOT-IN-tp5129912p5131127.html
> To unsubscribe from OrbisGIS, click here.
>

Je suis parti du principe que c'était NOT IN qui posait problème, et
pas IN. Mais comme dit plus haut, je peux pas vérifier. Désolé :-(

--
Les objets quantiques sont complètement dingues, mais au moins ils le
sont tous de la même façon.
Reply | Threaded
Open this post in threaded view
|

Re: Sql "WHERE NOT IN"

Nicolas F.
Administrator
D'abord merci pour votre support

Pas de chance pour le delete car l'instruction SQLExistsClause  est comprise mais n'est pas implémentée non plus.
Reply | Threaded
Open this post in threaded view
|

Re: Sql "WHERE NOT IN"

Alexis.G
Là moindre des choses, c'est de s'entraider ^_^

Si je pense à une autre tentative de parade, je te la transmets ;-)

2010/6/3 Nicolas F. (LCPC) [via OrbisGIS]
<[hidden email]>:

> D'abord merci pour votre support
>
> Pas de chance pour le delete car l'instruction SQLExistsClause  est comprise
> mais n'est pas implémentée non plus.
>
> ________________________________
> View message @
> http://orbisgis.3871844.n2.nabble.com/Sql-WHERE-NOT-IN-tp5129912p5134053.html
> To unsubscribe from OrbisGIS, click here.
>



--
Les objets quantiques sont complètement dingues, mais au moins ils le
sont tous de la même façon.
Reply | Threaded
Open this post in threaded view
|

Re: Sql "WHERE NOT IN"

quentindarakdjian
Bonjour,

J'aimerai raviver le sujet car j'ai un problème similaire à celui de Nicolas, mais je ne parviens pas à le surmonter, n'étant pas aidé par les liens étant aujourd'hui cassés.

J'ai les deux tables suivantes:

1/  bati_bd_parcellaire_0409_nonmit_intermediaire
Table contenant tout les bâtiments (mitoyens et non mitoyens)
La colonne NB_MITOYEN de la table du dessus est vide, le 0 ne correspond à rien.

2/ bati_bd_parcellaire_0409_mit
Table contenant les bâtiments avec au moins une mitoyenneté.



 Je souhaite créer une table contant les bâtiments qui n'ont aucune mitoyenneté effective (bâtiments en rose + vert foncé (sélection)) en supprimant ceux qui en ont une (bat vert clair).

Pour ce faire j'ai pensé en outre à une requête du type:
CREATE TABLE bat_nonmitoyens_intermediaire as SELECT a.* FROM bati_bd_parcellaire_0409_nonmit_intermediaire a, bati_bd_parcellaire_0409 b WHERE NOT ST_Contains(a.the_geom, b.the_geom);
ou
DELETE * from bati_bd_parcellaire_0409_nonmit_intermediaire where bati_bd_parcellaire_0409_nonmit_intermediaire.ID=bati_bd_parcellaire_0409_mit.ID;

mais rien y fais, soit le résultat contient plus 300 000 lignes soit la requête ne s'effectue pas.

Je suis bien conscient que le fait de manipuler deux tables en parallèle pose problème sans pour autant comprendre comment faire.

Si quelqu'un peut m'éclairer en me présentant la méthode appropriée j'en serai ravi.

Cordialement

Quentin
Reply | Threaded
Open this post in threaded view
|

Re: Sql "WHERE NOT IN"

Gwendall Petit
Administrator
Bonjour Quentin,

Est-ce que tes deux champs ID font bien référence aux mêmes bâtiments ? --> bat n°1 de la couche A est le même que le n°1 dans la couche B.

Cordialement,

Gwendall
Reply | Threaded
Open this post in threaded view
|

Re: Sql "WHERE NOT IN"

Gwendall Petit
Administrator
En fait, tu as plus de 300 000 objets renvoyés car quand tu fais ta requête le SQL réalise un produit des deux tables. L'objet 1 dans la table A est testé avec l'objet A de la table B, puis l'objet 2, ....
Il faut dont réduire la liste des objet dans l'une des deux tables à un seul objets pour que ça marche.

Si tu te bases sur les géométries de tes bâtiments, alors tu peux tenter l'approche suivante :
-- On unifie tous les bâtiments de la couche pour ne conserver qu'une seule géométrie
CREATE TABLE union_bat AS SELECT ST_UNION(the_geom) as the_geom FROM bati_bd_parcellaire_0409_mit;
-- On sélectionne les bâtiments qui n'intersectent pas la grosse géométrie précédemment créée
CREATE TABLE bat_non_mit AS SELECT a.* FROM bati_bd_parcellaire_0409_nonmit_intermediaire a, union_bat b WHERE st_intersects(a.the_geom, b.the_geom) = false;
Ce n'est pas spécialement optimisé ... mais vu ton jeu de donnée, ça devrait passer (enfin en tout cas chez moi ça marche :-) ).

J'espère que ça répond à ta question. Si non, n'hésites pas ...

Cordialement,

Gwendall
Reply | Threaded
Open this post in threaded view
|

Re: Sql "WHERE NOT IN"

quentindarakdjian
Merci Gwendall,

Ce code marche parfaitement. J'aurai du comprendre que le 300 000 était le produit des 2 tables, cela m'aurai fait comprendre bien des choses. De la à penser à la fonction ST_UNION j'ai des doutes... ça sera pour la prochaine fois.

Quentin