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

SQL Oracle Discussion :

Requêtes imbriquées et récupération du résultat


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Modérateur

    Inscrit en
    Octobre 2006
    Messages
    1 652
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 652
    Billets dans le blog
    6
    Par défaut Requêtes imbriquées et récupération du résultat
    Bonjour,

    Je souhaiterai faire une requête en SQL qui pourrait effectuer un gros traitement en une seule fois, mais je ne sais pas comment c'est faisable.

    J'en appelle à vous pour me guider, car je débute seulement en Oracle.


    Imaginons que la base que je souhaite remplir est composée de 2 tables :

    - table_noms (nom_id [INTEGER auto increment], nom [VARCHAR]) qui contient une liste de noms de personnes
    et
    - table_telephones (tel_id [INTEGER auto increment], tel_number [VARCHAR], nom_id [INTEGER]) qui contient une liste de numéros de téléphones.

    J'ai une clé étrangère sur le champ "nom_id" : un numéro de téléphone est forcement lié à un nom de personne.


    Je code un ETL en PHP qui me permet de remplir cette base de données.
    J'ai réussi à créer et remplir une table temporaire, qui contient toutes mes infos :
    temp_nom_tel (nom [VARCHAR], telephone [VARCHAR]).

    Je souhaiterai pouvoir faire de manière la plus optimisée mon chargement de tables.

    La première chose que j'ai faite, c'est un script PHP qui fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    pour chaque ligne je j'ai dans "temp_nom_tel"
    {
      - je fais un INSERT dans "table_nom" du nom
      - je récupère le "nom_id" qui a été créé
      - je fais un INSERT dans "table_telephones" du telephone et de l'id que j'ai récupéré à l'instant
    }
    Je fais donc pour chaque ligne 2 requêtes SQL.

    Le problème, c'est que quand j'ai 200'000 lignes, ça prend des plombes !!!


    Existe-t-il une façon de faire ce traitement avec un minimum de requêtes ?
    (quelle est la façon la plus optimisée de faire ce traitement ?)

    Je code en PHP en faisant des requêtes PDO, donc je ne sais pas si je peux exécuter des blocs de PL/SQL (sans parler du fait que je ne sais pas faire de scripts PL/SQL).



    Mon modèle est en réalité beaucoup plus compliqué que ce que j'ai présenté, c'est pour ça que je ne peux pas tout simplement changer mon modèle

  2. #2
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Si ta question est de savoir si tu peux insérer dans deux tables en une seule requête : pas à ma connaissance.

    Sinon essaie de repréciser ton problème.

  3. #3
    Modérateur

    Inscrit en
    Octobre 2006
    Messages
    1 652
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 652
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par plaineR Voir le message
    Si ta question est de savoir si tu peux insérer dans deux tables en une seule requête : pas à ma connaissance.

    Sinon essaie de repréciser ton problème.
    C'était effectivement une partie de ma question, merci.


    L'autre partie est "comment faire au mieux ?".

    Faut-il (peut-on) passer par un script PL/SQL ? Un script PHP ? Une procédure stockée ?


    Pour moi, tous les avis sont bons à prendre

  4. #4
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Peut-être en faisant deux insert "globaux" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    insert into table_noms (...)
    select ...
    from temp_nom_tel
    where ...
     
    insert into table_tel (nom_id, .....)
    select table_noms.nom_id, ...
    from temp_nom_tel, table_noms
    where <jointure entre les deux tables>

  5. #5
    Modérateur

    Inscrit en
    Octobre 2006
    Messages
    1 652
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 652
    Billets dans le blog
    6
    Par défaut


    J'avais retourné le problème dans tous les sens, et je n'ai jamais envisagé cette solution qui est pourtant simple et logique !

    Je te remercie beaucoup

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PDO] Récupération des résultats d'une requête
    Par nikco dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 09/06/2009, 01h26
  2. [Oracle] Récupération des résultats de la requête
    Par nadiaflamingenierie dans le forum PHP & Base de données
    Réponses: 0
    Dernier message: 03/04/2009, 19h05
  3. Requête imbriquée, ou pas, avec résultat nul
    Par skyl_pioup dans le forum Requêtes
    Réponses: 3
    Dernier message: 01/12/2007, 20h50
  4. Réponses: 15
    Dernier message: 03/10/2007, 17h02
  5. Récupération du résultat d'une requête sur une table liée
    Par champijulie dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 05/06/2007, 12h26

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