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 :

update et requete imbriquee


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 225
    Points : 97
    Points
    97
    Par défaut update et requete imbriquee
    bonjour,

    decidement je n'y arriverait pas...je sollicite votre aide encore une fois!

    j'ai une table A :
    x,y,val,distance

    et une table B :
    x,y,val

    je voudrais :
    mettre a jour A.distance quand A.val est null
    avec min(distance) entre A(x,y) et B(x,y)

    je remercie mille fois celui ou celle qui pourra m'aider a y voir plus clair,

    n

  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 811
    Points
    17 811
    Par défaut
    Avez-vous un exemple à proposer, car soit c'est une erreur d'énoncé soit j'ai raté un élément !

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 225
    Points : 97
    Points
    97
    Par défaut
    soit la table A avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    X         Y           VAL              DISTANCE
    ----------------------------------------
    x1        y1         val1             0.0
    x2        y2         val2             0.0
    x3        y3         null              null
    x4        y4         null              null
    et la table B avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    X         Y          
    ---------------
    x1        y1       
    x2        y2         
    x2        y3

    ce je souhaiterai faire c'est calculer pour toutes les valeurs (VAL) null de la table A le point le plus proche, autrement dit balayer la table B et remonter la plus petite distance (si execo trouvé : ne remonter qu'une valeur : limit 1 ?)

    je ne sais pas si c'est pluc clair ?
    encor emerci

    n

  4. #4
    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 811
    Points
    17 811
    Par défaut
    Oui c'est effectivement peu plus clair. Je ne sais pas ce que vous attendez dans val toutefois, pour l'exemple suivant je le fixe à 'A' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    UPDATE TableA tA
    SET val = 'A',
        distance = (SELECT min(power(tA.X-tB.X, 2) + power(tA.Y-tB.Y, 2))
                    FROM TableB tB)
    WHERE tA.val is null;
    Je pense que ça devrait fonctionner.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 225
    Points : 97
    Points
    97
    Par défaut
    merci Waldar, ça m'a l'air de bien marcher.

    j'avais des erreurs parce que le "select min" peut remonter plusieurs lignes, mais un "limit 1" suffit à corriger le problème.

    c'est d'une extraordinaire simplicité, je me demande pourquoi je suis partie sur des choses tarabiscotées... un échantillon de script :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    query := 'SELECT id, x_ori, y_ori from ' || nb_fichier_sortie[i] || ' where i_val is null';
      RAISE NOTICE 'query=%',query;
      open tbls2 FOR EXECUTE query;
      LOOP
        FETCH tbls2 INTO resultat;
        IF FOUND THEN RAISE NOTICE 'enreg trouve=%', FOUND; END IF;
        EXIT WHEN NOT FOUND;
        query2 := 'update ' || nb_fichier_sortie[i] || ' set distance =  (
    select ((' || resultat.x_ori || '-b.x)^2 + (' || resultat.y_ori ||'-b.y)^2)^0.5 as d 
    from ' || liste_couche[i] || ' b 
    where ((' || resultat.x_ori || '-b.x)^2 + (' || resultat.y_ori ||'-b.y)^2) = (select min(((' || resultat.x_ori || '-b.x)^2 + (' || resultat.y_ori || '-b.y)^2) ) 
    from ' || liste_couche[i] || ' b, ' || nb_fichier_sortie[i] || ' a 
    where a.i_val is null and abs(b.x - a.x_ori)<=5000 and abs(b.y -a.y_ori)<=5000 ) limit 1) 
    where id = ' || resultat.id;
     
        RAISE NOTICE 'query2=%',query2;
        EXECUTE query2;
      END LOOP;
      CLOSE tbls2;

    le calcul : abs(b.x - a.x_ori)<=5000 and abs(b.y -a.y_ori)<=5000
    vise à restreindre mon jeu de données en ne prenant que les points dont la distance est inférieure à 5km.

    En sachant que la table (B dans notre cas) comporte env. 500 000 points et que la table A peut comporter jusqu'à 120 000 points, est-ce que je gagne en temps de traitement avec ce type de calcul ?

    Comment Postgres va t'il gérer son affaire ? Ne va t-il pas balayer la table une première fois pour faire ce calcul et ensuite une deuxième pour restreindre ? auquel cas ne serait-il pas préférable de ne pas faire de restriction et d'appliquer le calcul de distance sur toute la table ?


    encore merci,

    n

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

Discussions similaires

  1. [VBnet][Access] Requete imbriquee "insert + select"
    Par Fab62_ dans le forum Windows Forms
    Réponses: 3
    Dernier message: 06/03/2006, 14h58
  2. requete imbriquee
    Par pascale86 dans le forum Requêtes
    Réponses: 6
    Dernier message: 23/09/2005, 16h10
  3. [UPDATE]Sous-requetes avec plusieurs nuplets
    Par Tchinkatchuk dans le forum Langage SQL
    Réponses: 2
    Dernier message: 11/07/2005, 19h28
  4. [REQUETE][IMBRIQUEE] Bien ou pas bien?
    Par fabszn dans le forum Langage SQL
    Réponses: 31
    Dernier message: 21/04/2005, 11h57
  5. PROBLEME DE REQUETE IMBRIQUEE
    Par fleuve007 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 31/12/2003, 16h33

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