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 :

Ordre des lignes sur jointure simple


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    décembre 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2004
    Messages : 62
    Points : 40
    Points
    40
    Par défaut Ordre des lignes sur jointure simple
    Bonjour,
    j'ai une question qui je pense n'a pas été abordée comme je veux, j'espere trouver une réponse ou plutôt des pistes.
    je fais une jointure sur 2 tables
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM T1, T2 WHERE T1.X=T2.Y AND...
    j'ai bien besoin de la requête comme ca (pas de jointure LEFT ou RIGHT) après, un curseur boucle dessus pour insérer les résultats dans une table T3. en plus pour des raisons de performances, on veut pas boucler sur T1, en faisant des appels à T2 dans la boucle.

    le besoin est de faire ca en plusieurs étapes (ou plutôt en plusieurs intervalles de temps d'exécution), et le but est donc de reprendre à la dernière ligne traitée lors de la dernière exécution. un mécanisme est en place pour stocker le nombre de lignes (de la jointure) traités, et de reprendre à ce nombre lors du traitement suivant.

    si la table T2 ne bouge pas entre 2 exécutions, il n'y a pas de souci, par contre le risque est bien présent comme les insertions se font sur des jours d'intervalles. (évidemment T1 reste inchangée pendant tout ce temps)

    dans le cas ou T2 bouge, la jointure pourrait ramener soit des lignes en plus soit en moins. et donc la reprise ne se fait probablement pas au bon endroit.

    est ce qu'il existe un moyen de réaliser ceci tout en gardant la boucle inchangée, en modifiant juste la requête principale, le but est de reprendre à la dernière ligne de T1 surtout.

    le dernier recours est évidemment la boucle sur T1, et l'appel à T2 dedans.

    Merci d'avance

  2. #2
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Vous avez besoin d’un mécanisme pour savoir ce que vous avez traité. Sinon, jointure ou pas votre traitement sera défaillant.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    décembre 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2004
    Messages : 62
    Points : 40
    Points
    40
    Par défaut
    J'ai pensé passer par les ROWID de T1, mais ca implique pas mal de vérification (surtout si mon ROWID de référence disparait dans la jointure du lancement suivant par mal chance)
    au détriment de la précision je pense que je vais passer au niveau macro, et n'arrêter qu'à la fin de chaque partition (64). ca dépassera mes compteurs mais je prendrai une marge d'avance pour être sûr, ca reste la solution la plus propre.

    mais une question : est ce qu'une table renvoie des ROWID (on va dire sans aucune clause ni tri) dans l'ordre alphabétique ou pas? et si elle n'a pas été modifiée, s'agit-il certainement du même ordre à chaque même requête (je pense que oui mais j'ai des doutes)

    Merci

  4. #4
    Membre éprouvé
    Inscrit en
    avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Oracle ne garanti aucun ordre de renvoi de lignes tant qu'il n'y a pas de clause "order by". Meme si de manière empirique tu aura l'impression qu'un ordre est toujours de mise, attention bien souvent ça dépend du plan d'exécution, et celui ci peu être amené à changer. Si oracle fait du parallélisme, là aussi, tout est chamboulé... bref, si tu veux un ordre, fait un "order by"

    Sinon, oracle te garanti la consistance de tes données quand tu ouvres un curseur, mais si tu laisses un curseur ouvert trop longtemps, tu vas avoir des problèmes (erreur "snapshot too old")

    Si tu veux faire des traitement par lot sur plusieurs jours, il est bien plus prudent de trouver des moyen applicatifs (colonnes pour flaguer les données traitées, tables temporaires etc...)

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    décembre 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2004
    Messages : 62
    Points : 40
    Points
    40
    Par défaut
    Merci pour ces précisions.

Discussions similaires

  1. Excel-copier des lignes sur une autre feuille
    Par petecul dans le forum Excel
    Réponses: 7
    Dernier message: 13/09/2007, 03h56
  2. Modifier ordre des lignes de JTable
    Par ALIAS200 dans le forum Composants
    Réponses: 12
    Dernier message: 31/05/2007, 22h16
  3. Snapshot log et ordre des lignes
    Par orafrance dans le forum Administration
    Réponses: 8
    Dernier message: 15/02/2007, 20h48
  4. l'ordre des lignes dans un Select
    Par comment_ca dans le forum Oracle
    Réponses: 15
    Dernier message: 05/10/2006, 12h08
  5. Ordre de sélection des lignes sur une table DB2
    Par Pierre Formosa dans le forum DB2
    Réponses: 1
    Dernier message: 26/04/2006, 21h03

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