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 :

Jointure sur colonne dynamique


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2005
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 32
    Points : 26
    Points
    26
    Par défaut Jointure sur colonne dynamique
    Bonjour à tous,

    On m'a exposé un petit problème et j'avoue avoir du mal à le résoudre... du reste je ne sais pas si c'est possible !

    J'explique :
    J'ai une table maTable avec les données suivantes :

    A 1
    B 1
    C 2
    D 2
    E 1
    F 2

    En une requête je dois obtenir :

    A 1
    C 2
    E 1
    F 2

    La logique est la suivante, je parcours ma table et lorsque la valeur de la deuxième colonne est différente de celle de la ligne précédente, j'affiche ma ligne, sinon je continue.
    Cela demande donc de pouvoir comparer pour chaque ligne les données de la ligne précédente....

    J'ai d'abord eu comme info que la table avait un id "classique" entier auto-incrémenté, j'avais donc écrit la requête suivante qui fonctionnait très bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT table2.col1, table2.col2
    FROM maTable AS table2 LEFT OUTER JOIN maTable AS table1 ON table2.id = table1.id + 1
    WHERE table2.col2 <> table1.col2
    ORDER BY table2.col1
    Super
    Sauf que.... on m'a dit après coup que l'id de la table pouvait être alphanumérique Du coup ma requête ne fonctionne plus...

    J'ai pensé recréer les id de façon dynamique (avec un row_number()) mais cela ne fonctionne pas... du moins je n'y arrive pas.

    J'ai un script qui fonctionne bien en passant par l'intermédiaire de tables temporaires mais ils voudraient pouvoir le faire en une seule requête

    Quelqu'un pourrait-il m'aider ??

    Merci.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 103
    Points : 28 400
    Points
    28 400
    Par défaut
    Pour connaître l'identifiant précédant, tu peux utiliser la structure de requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT  tbl.id      id
        ,   MAX(prc.id) precedent
    FROM    matable tbl
        LEFT JOIN
            matable prc
            ON  tbl.id > prc.id

  3. #3
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 034
    Points : 23 779
    Points
    23 779
    Par défaut
    Bonjour,

    Sur quel SGBD travaillez-vous ? S'il dispose des fonctions de fenêtrage, ça serait un plus pour traiter ce genre de problème.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Mai 2005
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 32
    Points : 26
    Points
    26
    Par défaut
    Je suis sur postgres.
    La solution de al1_24 à l'air de bien marcher, j'avais zappé que le Max fonctionnait dans ces cas là..
    Merci beaucoup.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Mai 2005
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 32
    Points : 26
    Points
    26
    Par défaut
    Désolé j'ouvre à nouveau

    Dernière information en date, les clés ne sont pas ordonnées... le MAX() ne fonctionne pas.
    En gros j'ai des lignes, sans aucune suite logique (mis à part que le lignes identiques se suivent) et je dois pouvoir comparer mes valeurs à celles de ma lignes précédentes....

    Peut être qu'avec un genre de rownum, ou de rowid ? Mais je n'y parviens pas sous postgres sans avoir besoin d'un tri..

    HELP !!

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 103
    Points : 28 400
    Points
    28 400
    Par défaut
    En SQL, une règle de base à ne pas oublier : une table n'est PAS ordonnée.

    Si tu n'as pas de colonne(s) sur laquelle t'appuyer pour identifier l'ordre de création des lignes, il n'est pas possible de trouver la première et la dernière ligne, a fortiori la précédente

  7. #7
    Nouveau membre du Club
    Inscrit en
    Mai 2005
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 32
    Points : 26
    Points
    26
    Par défaut
    Oui c'est bien ce que je pensais...
    Je ne vois pas non plus comment y arriver sans parcourir la table ou préparer les données !
    Et bien, il va falloir qu'il fasse autrement.
    Merci.

  8. #8
    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 : 61
    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 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Je ne vois pas non plus comment y arriver sans parcourir la table
    Parcourir la table n'y changera rien car rien ne garantit l'ordre dans lequel cette table sera parcourue par le SGBD pour délivrer le résultat.

    Il faut donc, d'une manière ou d'une autre, déterminer les critères d'ordonnancement des données de la table et valoriser cet ordonnancement par une colonne d'ordre qui pourra être utilisée pour répondre au besoin.

Discussions similaires

  1. [WD14] Impression d'un état sur table dynamique de colonnes clonées
    Par kuranes dans le forum WinDev
    Réponses: 2
    Dernier message: 28/09/2009, 14h06
  2. table dynamique et binding sur colonnes dynamique
    Par *alexandre* dans le forum JSF
    Réponses: 3
    Dernier message: 11/09/2009, 10h59
  3. recherche sur une colonne dynamique
    Par gasper06 dans le forum Excel
    Réponses: 5
    Dernier message: 07/07/2009, 14h47
  4. Tri dynamique sur colonnes d'une table
    Par scariou29 dans le forum BIRT
    Réponses: 10
    Dernier message: 17/09/2008, 16h51
  5. Update dans SYBASE avec jointure sur 2 colonnes
    Par metheorn dans le forum Sybase
    Réponses: 2
    Dernier message: 24/06/2005, 16h51

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