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

Firebird Discussion :

Afficher une ligne qu'une seule fois


Sujet :

Firebird

  1. #1
    Membre du Club
    Afficher une ligne qu'une seule fois
    Bonsoir à tous,

    Je cherche à faire une sélection sur une table comme suivant :

    Select ID, NID, Nom, Prenom ... From Client

    Résultat
    1 1 Martin Paul
    2 2 Dupont Olivier
    3 2 Toto Marc

    Je souhaite que le résultat du champ NID ne soit pas répété
    1 1 Martin Paul
    2 2 Dupont Olivier

    J'ai essayé Distinct, il m'affiche les 3 lignes



    Pourriez vous m'aider SVP

  2. #2
    Expert éminent sénior
    Salut fveto.

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    CREATE DATABASE '..\Data\Base.fdb' page_size 4096 DEFAULT CHARACTER SET WIN1252;
     
    -- ===========================
    -- Création de la table 'test'
    -- ===========================
     
    create table test (
      id      integer generated by default as identity not null,
      nid     smallint                                 not null,
      nom     varchar(10)                              not null,
      prenom  varchar(10)                              not null,
      primary key (id)
    );
     
    -- =====================
    -- Insertion dans 'test'
    -- =====================
     
    insert into test (nid,nom,prenom) values (1, 'Martin',    'Paul');
    insert into test (nid,nom,prenom) values (2, 'Dupond',    'Olivier');
    insert into test (nid,nom,prenom) values (2, 'Toto',      'Marc');
    insert into test (nid,nom,prenom) values (3, 'Grandjean', 'Léon');
    insert into test (nid,nom,prenom) values (3, 'Durand',    'Albert');
    insert into test (nid,nom,prenom) values (3, 'Smith',     'John');
     
    -- ================
    -- Vidage de 'test'
    -- ================
     
    select  *
      from  test;
     
              ID     NID NOM        PRENOM
    ============ ======= ========== ==========
               1       1 Martin     Paul
               2       2 Dupond     Olivier
               3       2 Toto       Marc
               4       3 Grandjean  Léon
               5       3 Durand     Albert
               6       3 Smith      John
     
     
    -- ===========
    -- Requête N°1
    -- ===========
     
    select      t1.*
          from  test as t1
    inner join  (  select  nid,
                           min(id) as id
                     from  test
                 group by  nid
                ) as t2
            on  t2.id = t1.id;
     
              ID     NID NOM        PRENOM
    ============ ======= ========== ==========
               1       1 Martin     Paul
               2       2 Dupond     Olivier
               4       3 Grandjean  Léon
     
     
    -- ===========
    -- Requête N°2
    -- ===========
     
    select      t1.*
          from  test as t1
    inner join  (  select  nid,
                           max(id) as id
                     from  test
                 group by  nid
                ) as t2
            on  t2.id = t1.id;
     
              ID     NID NOM        PRENOM
    ============ ======= ========== ==========
               1       1 Martin     Paul
               3       2 Toto       Marc
               6       3 Smith      John
     
     
    exit;
     
    Appuyez sur une touche pour continuer...


    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  3. #3
    Membre du Club
    Bonjour Artemus,

    Grand merci !!!

    ça fonctionne à merveille.

  4. #4
    Expert éminent sénior
    Bonjour,

    De nombreuses solutions sont possibles : fonction d'agrégation comme proposé par Artemus, fonction OLAP, test d'existence...
    Mais il faut surtout donner la règle gestion qui permet de déterminer quelle ligne conserver en cas de double

    Voici plusieurs solutions possibles :
    -1- avec Min ou Max
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
       select ID                 
            , NID                
            , NOM                
            , PRENOM             
       from CLIENT T1            
       where ID=                 
            (select MIN(ID)      
             from CLIENT T2      
             where T2.NID=T1.NID)
       order by ID               
              , NOM


    -2- avec un test d'existence
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
       select ID                   
            , NID                  
            , NOM                  
            , PRENOM               
       from CLIENT T1              
       where not exists            
            (select 1              
             from CLIENT T2        
             where T2.NID=T1.NID   
               and T2.ID<T1.ID)    
       order by ID                 
              , NOM


    -3- avec une jointure outer
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
       select T1.ID                  
            , T1.NID                 
            , T1.NOM                 
            , T1.PRENOM              
       from CLIENT T1                
       left join CLIENT T2           
         on T2.NID=T1.NID            
        and T2.ID <T1.ID             
       where T2.ID is null           
       order by T1.ID                
              , T1.NOM


    -4- avec une fonction fenêtrée
    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
       select T1.ID                                   
            , T1.NID                                  
            , T1.NOM                                  
            , T1.PRENOM                               
       from CLIENT T1                                 
       inner join                                     
            (select ID                                
                  , NID                               
                  , row_number()                      
                    over(partition by NID             
                         order by ID asc) as RANG     
             from CLIENT                              
            ) as T2                                   
          on T2.ID  =T1.ID                            
         and T2.NID =T1.NID                           
         and T2.RANG=1                                
       order by T1.ID                                 
              , T1.NOM


    Sans doute y en a -t- il d'autres

  5. #5
    Expert éminent sénior
    Salut à tous.

    En effet, Escartefigue a raison car il existe plusieurs solutions à ce problème.
    Je suis parti de l'idée de sélectionner les lignes entières.
    D'où la sous-requête qui va récupérer l'identifiant soit le premier, ou soit le dernier selon les multiples valeurs identiques de votre colonne nid.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  6. #6
    Expert éminent sénior
    Salut Artemus,

    Nos messages se sont croisés, je viens juste de publier plusieurs solutions possibles en éditant mon post précédent

  7. #7
    Expert éminent sénior
    Salut Escartefigue.

    Oui, vous avez raison d'enrichir avec d'autres solutions ce sujet.

    Comme je le suppose, fveto doit être débutant et je n'ai pas complexifier à outrance la solution qu'il recherche.
    C'est pourquoi, j'ai indiqué une solution, la plus basique, en fonction du peu d'information que fveto nous a communiqué.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

###raw>template_hook.ano_emploi###