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

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Sun 29 April 2012 23:34

simo lay
Participant assidu
Date d'inscription: 8 Dec 2011
Messages: 172

sql

Bonjour,
j'ai importer deux tables  ( TABLE2010 et TABLE 2011 ils ont un champ commun NOM) sur postgis, et je suis entrain de faire un croisement entre ces deux tables pour savoir les enregistrement qui se trouve dans les deux et ceux qui existent uniquement dans une seule table,
danc le code sql pour trouver les enregistrement sur les table est le suivant;

SELECT * FROM table2011 JOIN table2010 ON (TABLE2011.NOM = TABLE2010.NOM)

ça marche très bien j'obtiens très vite le résultats souhaité 

le problème que j'ai c'est dans le cas ou je veux savoir les enregistrements qui existe sur la table2011 et qui ne le sont pas dans la table 2010 9A PREND Beaucoup de temps.  et voici la requête que je fai 

SELECT * FROM table2011 JOIN table2010 ON (TABLE2011.NOM <> TABLE2010.NOM)

donc je me demande s'il y a un moyen ou une requête  plus rapide  pour avoir le résultat (a savoir que ces deux tables ne sont pa spatiales )

merciiiiiiii

Hors ligne

 

#2 Sun 29 April 2012 23:39

tumasgiu
Membre
Lieu: Ajaccio
Date d'inscription: 5 Jul 2010
Messages: 1159

Re: sql

Salut,
il me semble qu'un outer join conviendrait bien.

Hors ligne

 

#3 Sun 29 April 2012 23:51

Maurice
Membre
Lieu: Montpellier
Date d'inscription: 5 Sep 2005
Messages: 5331

Re: sql

Bonjour
Je m'immisce juste pour dire qu'en SQL de MapInfo on dirait:
Select * from TABLE2011 where not NOM in (select NOM from TABLE2010)

Dernière modification par Maurice (Tue 01 May 2012 00:06)

Hors ligne

 

#4 Mon 30 April 2012 01:02

simo lay
Participant assidu
Date d'inscription: 8 Dec 2011
Messages: 172

Re: sql

j'ai testé
Select * from TABLE2011 where not NOM in (select CNOM from TABLE2010)
et c'est  beaucoup plus rapide que les deux autres requêtes
merciii

Hors ligne

 

#5 Mon 30 April 2012 01:11

vincentp
Participant actif
Lieu: Drôme
Date d'inscription: 18 Jul 2006
Messages: 128
Site web

Re: sql

Bonjour,

La méthode du «not in» fonctionne correctement, mais est souvent moins rapide que la formulation en jointure gauche lorsqu'il y a beaucoup d'enregistrements :

Code:

select * from table1 left join table2 on table1.nom = table2.nom where table2.nom is null;

Hors ligne

 

#6 Mon 30 April 2012 10:08

tumasgiu
Membre
Lieu: Ajaccio
Date d'inscription: 5 Jul 2010
Messages: 1159

Re: sql

Salut,

petit test matinal, avec postGres 9.0, en utilisant deux tables t1 et t2, ayant toute deux une clef primaire c :

Code:

create table t1(c integer primary key);
create table t2(c integer primary key);
select * from t1 where t1.c not in (select * from t2) ; #seq scan sur t1 + seq scan sur t2.
select * t1 left join t2 using(c); #un seul seq scan sur t1 !

avec deux tables t1 et t2, ayant toute deux une colonne indexée c :

Code:

create table t1(c integer );
create index idx_t1 on t1(c);
create table t2(c integer);
create index idx_t2 on t2(c);

select * from t1 where t1.c not in (select * from t2) ; #seq scan sur t1 + seq scan sur t2.
select * t1 left join t2 using(c); #index scan sur t1 + materialize(index scan sur t2).

Dernière modification par tumasgiu (Mon 30 April 2012 10:30)

Hors ligne

 

#7 Mon 30 April 2012 14:47

simo lay
Participant assidu
Date d'inscription: 8 Dec 2011
Messages: 172

Re: sql

Salut,
j'ai testé

select * from table1 left join table2 on table1.nom = table2.nom where table2.nom is null;

c'est la plus rapide ça a pris 2526 ms par contre le not in ça prend 605896 ms et pour outer joint ça n a pas marché
merci à vous tous

Hors ligne

 

#8 Mon 30 April 2012 15:53

simo lay
Participant assidu
Date d'inscription: 8 Dec 2011
Messages: 172

Re: sql

Salut,
j'ai une question comment créer une table à partie du résultat obtenu
je fais

Code:

CREATE OR REPLACE VIEW  RESULTAT AS   select * from table1 left join table2 on table1.nom = table2.nom where table2.nom is null;

j'ai essayé

Code:

creata or replace table   RESULTAT AS   select * from table1 left join table2 on table1.nom = table2.nom where table2.nom is null;

mais ça marche pa pouvez vous me dire comment faire ?

Dernière modification par simo lay (Mon 30 April 2012 15:57)

Hors ligne

 

#9 Mon 30 April 2012 16:20

ChristopheV
Membre
Lieu: Ajaccio
Date d'inscription: 7 Sep 2005
Messages: 3197
Site web

Re: sql

Bonjour,

Merci d'utiliser les balises

Code:

, c'est beaucoup plus lisible, non ?

De même, même si c'est la fête du travail, faites attention à votre orthographe.


Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close

Hors ligne

 

#10 Tue 01 May 2012 13:53

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1554

Re: sql

Bonjour,

Ca devrait marcher.
Quel message d'erreur avez-vous ? La table "resultats" n'existe pas deja ?

Nicolas

Hors ligne

 

#11 Tue 01 May 2012 14:44

simo lay
Participant assidu
Date d'inscription: 8 Dec 2011
Messages: 172

Re: sql

oui exactement

Hors ligne

 

Pied de page des forums

Powered by FluxBB