IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Requête SQL sur deux champs - débutant


Sujet :

Langage SQL

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Requête SQL sur deux champs - débutant
    Bonjour,

    Voilà je dispose d'une base de données des Communes Françaises avec une entrée pour chaque commune. Dans cette base de données voilà les champs qui m'intéressent :
    • le code INSEE qui est l'identifiant unique des communes
    • le code SIREN de la communauté de communes à laquelle appartient la commune


    Mon souhait serait de pouvoir sélectionner toutes les communes d'une communauté de commune en connaissant seulement le code INSEE d'une de ses communes. Ou dit autrement selectionner toutes les communes qui ont le même code SIREN que la commune dont je connais le code INSEE.

    Pour information complémentaire il s'agit d'une requête qui sera exécutée sous le logiciel GRASS GIS ; s'il s'agit d'une requête standard je devrai normalement pouvoir la rédiger dans GRASS GIS ensuite. Je tiens à préciser que je suis débutant.

    Cordialement,

    Charles

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Il n'y a ni les informations suffisantes pour vous aider efficacement (SGBD, tables, données), ni un début de requête qui montre que vous ayez un peu cherché.

    Le sujet est bien écrit - ce qui est agréable - mais je doute que vous ayez lu les liens permanents du forums : qui contiennent notamment règles, tutoriels et cours SQL, FAQ et bien d'autres sujets intéressants encore.

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Je n'ai effectivement pas lu les règles par contre je suis allé voir les cours et la faq mais ayant une mauvaise connaissance du sql je n'ai pas trouvé de solution. Donc si vous êtes convaincu qu'elle s'y trouve un simple lien vers une piste sera déjà un bon début pour moi.

    Le SGBDR avec lequel je travail s'appelle GRASS GIS, il s'agit d'un système d'information géographique capable de travailler avec différents type de base de données dont les fichiers DBF ce qui est le cas dans mon problème
    Voilà un exemple de requête tel que GRASS GIS va l'exécuter (ici dans avec le module v.extract qui sert à afficher des données de type vecteur) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    v.extract 
    input = markveggy.shp 
    output = markveggy.1 
    where = "(VEGTYPE = 'Wi') 
      or (VEGTYPE = 'PS') 
      or (PRIME_TYPE='Wi')"
    Voilà un autre exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    echo "SELECT * 
    FROM archsites 
    WHERE str1 <> 'No Name'" | db.select
    Pour la curiosité la page suivante http://www.grass.itc.it/grass62/manu..._user/sql.html présente la partie SQL du manuel de GRASS GIS.


    La table sur laquelle je souahtie exécuter une requête a la structure suivante

    champ type
    INSEE string
    SIREN string
    NOM string
    ...
    INSEE SIREN NOM
    00001 00000001 Commune_A
    00002 00000001 Commune_B
    00003 00000001 Commune_C
    00004 00000002 Commune_D
    00005 00000002 Commune_D
    00006 00000002 Commune_E
    ...
    Je souhaite à partir du code INSEE d'une commune pouvoir selectionner toutes les communes qui ont le même code SIREN que la commune dont je connais le code INSEE

    exemple je connais le code INSEE de Commune_A qui est 00001 je souhaite obtenir la table suivante (en partant du principe que je connais pas le code SIREN) :

    INSEE SIREN NOM
    00001 00000001 Commune_A
    00002 00000001 Commune_B
    00003 00000001 Commune_C
    Voilà la façon dont je penserai parvenir à ma solution mais celà ne semble pas fonctionner.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    v.extract 
    input=communes.shp 
    output=communaute_de_commune_A 
    where SIREN like 
    where INSEE like 00001
    Je sais que ce n'est pas une façon habituelle de rédiger une requête c'est pourquoi si vous savez comment répondre à mon problème sous une forme plus courante je chercherai de mon coté comment l'adapter à GRASS GIS mais mon problème vient d'abord du fait que je ne sais pas rédiger ce genre de requête qui doit surement être simple.

    Cordialement,

    Charles

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par mygeomatic Voir le message
    différents type de base de données dont les fichiers DBF ce qui est le cas dans mon problème
    DBF ! Ca existe encore ça ? !
    Voilà un exemple de requête tel que GRASS GIS va l'exécuter (ici dans avec le module v.extract qui sert à afficher des données de type vecteur) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    v.extract 
    input = markveggy.shp 
    output = markveggy.1 
    where = "(VEGTYPE = 'Wi') 
      or (VEGTYPE = 'PS') 
      or (PRIME_TYPE='Wi')"
    Ca ce n'est pas du SQL !
    Voilà un autre exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    echo "SELECT * 
    FROM archsites 
    WHERE str1 <> 'No Name'" | db.select
    Ca y ressemble davantage !

    Pour la curiosité la page suivante http://www.grass.itc.it/grass62/manu..._user/sql.html présente la partie SQL du manuel de GRASS GIS.


    La table sur laquelle je souahtie exécuter une requête a la structure suivante
    champ type
    INSEE string
    SIREN string
    NOM string
    ...
    Je souhaite à partir du code INSEE d'une commune pouvoir selectionner toutes les communes qui ont le même code SIREN que la commune dont je connais le code INSEE
    Alors en SQL standard, ça donnerait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT t1.INSEE
    FROM laTable AS t1
    INNER JOIN laTable AS t2 ON t1.SIREN = t2.SIREN
    WHERE t2.INSEE = '00001'
      AND t1.INSEE <> '00001'
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci pour cette réponse.

    Juste pour m'assurer d'avoir bien compris, en fait en l'absence de deux tables distincte la fonction INNER JOIN permet de faire une "liaison entre les champs".

    Dans ce cas je me pose deux questions :
    • pourquoi SELECT t1.INSEE et SELECT * puisque je veux récupérer l'ensemble de mes champs
    • pourquoi AND t1.INSEE <> '00001'


    A partir de ce que tu me propose j'aurai plus imaginé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT *
    FROM laTable AS t1
    INNER JOIN laTable AS t2 ON t1.SIREN = t2.SIREN
    WHERE t2.INSEE = '00001'
    mais c'est peut-être que je n'ai rien compris aussi.

    Maintenant je n'ai pour l'instant aucune idée de la façon dont je vais pouvoir l'utiliser sous GRASS mais je vais chercher.

    Merci encore pour votre aide.

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    [quote=mygeomatic;4878914]Juste pour m'assurer d'avoir bien compris, en fait en l'absence de deux tables distincte la fonction INNER JOIN permet de faire une "liaison entre les champs".[/quote)
    INNER JOIN opère une jointure entre les tables, ici deux occurrences de la même table. Cette jointure s'opère sur une condition de jointure qui suit l'opérateur ON sur l'égalité du SIREN dans les deux tables. Ainsi on rapproche toutes les communes ayant le SIREN identique.

    Il faut trouver le nom de cette table au fait et le mettre à la place de 'laTable' dans ma requête.

    Dans ce cas je me pose deux questions :
    • pourquoi SELECT t1.INSEE et SELECT * puisque je veux récupérer l'ensemble de mes champs

    Il vaut mieux éviter SELECT * et nommer les colonnes.
    En l'occurrence, si tu fais SELECT *, tu auras toutes les colonnes de l'instance t1 et toutes les colonnes de l'instance t2 donc 6 colonnes au lieu de 3.

    Tu peux donc faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT t1.INSEE, t1.NOM
    Le SIREN, tu le connais déjà.

    pourquoi AND t1.INSEE <> '00001'
    Puisque tu cherches les communes ayant le même SIREN que la commune '00001', j'ai pensé que tu n'avais pas besoin de récupérer cette commune donc je l'ai exclue.


    Maintenant je n'ai pour l'instant aucune idée de la façon dont je vais pouvoir l'utiliser sous GRASS mais je vais chercher.
    Probablement de la même manière que dans cet exemple :
    Select all attributes from table where str1 column values are not 'No Name':
    echo "SELECT * FROM archsites WHERE str1 <> 'No Name'" | db.select
    Soit dans ton cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    echo "
    SELECT t1.INSEE
    FROM laTable AS t1
    INNER JOIN laTable AS t2 ON t1.SIREN = t2.SIREN
    WHERE t2.INSEE = '00001'
      AND t1.INSEE <> '00001'
    " | db.select
    A essayer.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Probablement de la même manière que dans cet exemple :
    Citation:
    Select all attributes from table where str1 column values are not 'No Name':
    echo "SELECT * FROM archsites WHERE str1 <> 'No Name'" | db.select
    Soit dans ton cas :
    Code :

    echo "
    SELECT t1.INSEE
    FROM laTable AS t1
    INNER JOIN laTable AS t2 ON t1.SIREN = t2.SIREN
    WHERE t2.INSEE = '00001'
    AND t1.INSEE <> '00001'
    " | db.SELECT

    A essayer.
    Merci de me confirmer c'est ce que je pensais faire mais c'est toujours rassurant d'avoir confirmation.

    Merci pour toutes les précisions, je vais testé ça dès que possible et je témoignerai mes progrès... par contre je suis en vacance ce soir alors ça risque d'attendre l'année prochaine.

    Bonne fêtes de fin d'année,

    Charles

Discussions similaires

  1. requête sql sur deux tables
    Par canacana dans le forum Requêtes
    Réponses: 3
    Dernier message: 02/02/2010, 18h37
  2. mettre une requête SQL sur deux lignes
    Par MAMANHOU dans le forum VBA Access
    Réponses: 2
    Dernier message: 07/11/2008, 15h37
  3. Requête SQL sur dernier champs connu
    Par Echizen1 dans le forum Access
    Réponses: 1
    Dernier message: 13/06/2007, 21h36
  4. [SQL] Problème avec script de pagination et requête sql sur deux tables
    Par psychoBob dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 12/06/2006, 14h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo