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 Firebird Discussion :

Récuperer le premier tuple ?


Sujet :

SQL Firebird

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 940
    Billets dans le blog
    66
    Par défaut Récuperer le premier tuple ?
    J'ai deux tables (simplifiées)

    MATIERES
    CODE_MATIERE
    LIBELLE

    FOURNIPAR
    CODE_MATIERE
    CODE_FOURNISSEUR
    PRINCIPAL (O/N)
    relation : 1 / (0,n)

    je voudrais obtenir une liste des matières avec leur premier fournisseur , de préférences le principal (il devrait y en a toujours un et un seul mais ce serait trop beau !!)

    un jeu d'essai
    MATIERES
    1,NUBUCK
    2,VEAU
    3,ALCANTARA
    4,ETIQUETTE

    FOURNIPAR
    1,0001,O
    1,0002,N
    2,0002,O
    3,0003,N //<-- le fournisseur principal a disparu, ou il n'y en a jamais eu
    Je voudrais obtenir
    CODE_MATIERE,LIBELLE,FOURNISSEUR
    1,NUBUCK,0001
    2,VEAU,0002
    3,ALCANTARA,0003
    4,ETIQUETTE,null
    Comment faire ? je sèche

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 940
    Billets dans le blog
    66
    Par défaut Y aurait-il une manière plus 'élégante'
    Après bien des erreurs de syntaxe j'ai trouvé une solution mais la première partie (la CTE) ne pourrait-elle pas être améliorée ? voir remaniée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    WITH F AS (SELECT R.MATIERE,(SELECT FIRST 1 M.CODE_FOURNISSEUR FROM FOURNIPAR M WHERE M.MATIERE=R.MATIERE ORDER BY M.MATIERE,M.PRINCIPAL DESC) AS FOURNISSEUR
    FROM MATFRN R
    )
     
    SELECT M.CODE_MATIERE,M.LIBELLE,F.CODE_FOURNISSEUR
    FROM MATIERES M  JOIN F ON N.MATIERE=F.MATIERE

  3. #3
    Membre Expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Par défaut


    si tu es certain qu'il n'y a qu'un fournisseur principal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT M.CODE_MATIERE,M.LIBELLE,F.CODE_FOURNISSEUR
     FROM MATIERES M 
     LEFT JOIN FOURNIPAR F ON F.CODE_MATIERE=M.CODE_MATIERE AND F.PRINCIPAL='O'
    s'il peut y en avoir plusieurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT M.CODE_MATIERE,M.LIBELLE,MAX(F.CODE_FOURNISSEUR)
     FROM MATIERES M 
     LEFT JOIN FOURNIPAR F ON F.CODE_MATIERE=M.CODE_MATIERE AND F.PRINCIPAL='O'
     GROUP BY 1,2
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT M.CODE_MATIERE,M.LIBELLE,MIN(F.CODE_FOURNISSEUR)
     FROM MATIERES M 
     LEFT JOIN FOURNIPAR F ON F.CODE_MATIERE=M.CODE_MATIERE AND F.PRINCIPAL='O'
     GROUP BY 1,2

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 940
    Billets dans le blog
    66
    Par défaut
    Citation Envoyé par makowski Voir le message
    si tu es certain qu'il n'y a qu'un fournisseur principal
    Oui mais non justement , (voir jeu d'essai matiere 3) ,
    donc impossible de tester sur la colonne PRINCIPAL , cela aurait été trop simple

  5. #5
    Membre Expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Par défaut
    ce que je t'ai envoyé fonctionne

    ceci dit, ton modèle est mal fait s'il permet plusieurs "principaux"

    s'il peut y en avoir plusieurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT M.CODE_MATIERE,M.LIBELLE,MAX(F.CODE_FOURNISSEUR)
     FROM MATIERES M 
     LEFT JOIN FOURNIPAR F ON F.CODE_MATIERE=M.CODE_MATIERE AND F.PRINCIPAL='O'
     GROUP BY 1,2
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT M.CODE_MATIERE,M.LIBELLE,MIN(F.CODE_FOURNISSEUR)
     FROM MATIERES M 
     LEFT JOIN FOURNIPAR F ON F.CODE_MATIERE=M.CODE_MATIERE AND F.PRINCIPAL='O'
     GROUP BY 1,2

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 940
    Billets dans le blog
    66
    Par défaut
    Ce que tu m'as indiqué fonctionne parfaitement

    Mais , ce que je voulais dire c'est qu'il se peut qu'une matière n'ai aucun fournisseur principal
    (Soit parce que celui-ci a été supprimé et non remplacé
    Soit parce que jamais indiqué cela dépendant par exemple de l'appel d'offre)

    donc on peut se trouver dans les situations suivantes
    il y a un fournisseur principal
    il y a un fournisseur 'principal' et des 'occasionnels'
    il n'y a pas de fournisseur principal , que des occasionnels
    il n'y a aucun fournisseur
    le cas : il y a deux fournisseurs principaux n'est "encore" jamais arrivé (il y a une contrainte)

    [Note] le schéma est simplifié a l'extrême mais c'est a peu près ça

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/04/2008, 14h49
  2. [VBA-E] Récuperer la premiere lettre d'une cellules
    Par cyraile dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 21/03/2007, 12h37
  3. recuperer le premier tuple
    Par agougeon dans le forum Sybase
    Réponses: 3
    Dernier message: 25/07/2006, 13h05
  4. [Tableaux] récuperer n premiers mots d'une chaine
    Par gibigue dans le forum Langage
    Réponses: 2
    Dernier message: 05/06/2006, 02h17
  5. [C#] Récuperer la premiere ligne d'un SqlDataReader
    Par Oberown dans le forum Windows Forms
    Réponses: 3
    Dernier message: 10/01/2005, 18h26

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