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 :

[Teradata] Résultats à critères semblables


Sujet :

Langage SQL

  1. #1
    Nouveau Candidat au Club
    [Teradata] Résultats à critères semblables
    Bonjour à tous,

    Je m'excuse par avance du niveau de cette question.

    Je précise que j'utilise TERADATA.

    Imaginons la BDD suivante :

    EMPLOYES_DB


    [TH]Prénom[/TH]
    [TH]Genre[/TH]
    [TH]Age[/TH]
    Johnny H 24
    Vanessa F 21
    Hervé H 23
    Camille F 25
    Daniel H 24
    Alexandre H 22

    Je voudrais obtenir tous les employés similaires aux critères de Johnny à savoir Johnny et Daniel.
    Je précise que je ne connais que le prénom de Johnny (pas son genre et pas son age).

    J'ai utilisé des sous-requêtes et écris :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT *
    FROM EMPLOYES_DB
    WHERE Genre in (
         select Genre
         from EMPLOYES_DB
         where Prénom = 'Johnny'
    )
    and Age in (
         select Age
         from EMPLOYES_DB
         where Prénom = 'Johnny'
    )


    Mais si la liste des critères s'allonge c'est ingérable... Je sais qu'il y a forcément mieux et que c'est sans doute très facile.
    Pourriez-vous m'aiguiller svp ?

    Je vous en remercie par avance.

  2. #2
    Expert éminent sénior
    Bonsoir

    Pourquoi faire simple quand on peut faire compliqué

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT T2.numero
         , T2.prenom
         , T2.nom
         , T2.genre
         , T2.date_naissance
    FROM EMPLOYES_DB T1
    inner join
         EMPLOYES_DB T2
       on T2.genre = T1.genre
      and T2.age   = T1.age
      and T2.xxxx  = T1.xxxx
    WHERE T1.numero = 123456 -- le numéro de johnny


    À noter : l'âge ne devrait pas être une colonne de la table. Il faut stocker la date de naissance qui est invariante contrairement à l'âge et calculer celui-ci quand vous en avez besoin

  3. #3
    Nouveau Candidat au Club
    Merci beaucoup pour cette réponse.
    Il suffisait donc de faire correctement la jointure !
    L'âge était simplement un exemple au hasard mais merci pour cette précision si un jour je dois créer moi même un table avec cette donnée.
    Excellente soirée.

  4. #4
    Modérateur

    Une autre solution, sans jointure :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      select Prenom
           , Genre
           , Age
        from EMPLOYES_DB
     qualify Genre = max(case Prenom when 'Johnny' then Genre end) over()
         and Age   = max(case Prenom when 'Johnny' then Age   end) over();