#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: 1160
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
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: 1160
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: 3199
- 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