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 :

Combinaison de champs dans une requête


Sujet :

Langage SQL

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 66
    Par défaut Combinaison de champs dans une requête
    Bonjour,

    J'ai une table établissant une relation réversible "voir aussi" entre deux descripteurs d'un thésaurus. J'entends par réversible que la relation doit fonctionenr dans les deux sens et plutôt que de la modéliser de la façon suivante :

    desc1 desc2
    1 5
    5 1

    j'ai opté pour simplement une seule ligne :

    desc1 desc2
    1 5

    Cela consomme moins de mémoire mais peut être que cela complique mes requêtes SQL comme indiqué ci-dessous... Donc sur l'exemple ci-dessous, j'ai une table de relations "voir aussi" :

    desc1 desc2
    1 5
    5 2
    3 7
    5 4
    8 5

    Je voudrais lister dans mon formulaire les descripteurs à voir aussi lorsque le descripteur N°5 est sélectionné. J'ai donc besoin de produire la liste suivante :

    voir aussi (5)
    1
    2
    4
    8

    Cela ne correspond ni à une concaténation, ni une union, ni une fusion... Alors je ne vois pas bien comment m'y prendre ! Peut-être que mon schéma relationnel n'est pas le bon ? Sinon comment formuler ma requête SQL ? Notez que j'utilise Base de LibreOffice et je n'ai pas l'union...

    Je vous remercie pour votre aide.

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 544
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 544
    Par défaut
    Bonjour,
    Avec un simple OR dans le WHERE, et un CASE (ou un DECODE) dans le SELECT ?

    Tatayo.

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 770
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par tatayo Voir le message
    Bonjour,
    Avec un simple OR dans le WHERE, et un CASE (ou un DECODE) dans le SELECT ?

    Tatayo.
    Oui, ou encore une requete union

  4. #4
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 544
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 544
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Oui, ou encore une requete union
    Ou pas:
    Citation Envoyé par gelinp Voir le message
    Notez que j'utilise Base de LibreOffice et je n'ai pas l'union...
    Tatayo.

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 770
    Billets dans le blog
    10
    Par défaut
    Damned !

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 66
    Par défaut
    Merci pour l'info, j'avais oublié l’existence du CASE et DECODE... J'ai essayé avec CASE car il me semble que sous LibreOffice je n'ai pas accès à l'instruction DECODE. Peut être que j'aurais l'accès à cette fonction avec une connexion MySQL depuis LibreOffice mais là j'utilise une base HSQLDB. J'ai donc essayé avec la requête suivante :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT CASE WHEN "fkDescSource" = 5 THEN "fkDescCible" ELSE "fkDescSource" END AS "voiraussi" FROM "LesVoirAussi";
    Cette requête s'execute sans erreur dans LibreOffice. Mais au lieu de me lister les valeurs "kkDescCible" lorsque "fkDescSource"=5 j'obtiens dans ma table résultat des valeurs égales à 0... Est-ce cette fonction CASE est limitée dans l'expression du résultat à fixer une constante ou peut on vraiment utiliser un autre champs de al table afin de transférer des valeurs d'une colonne à une autre ?

    Merci pour votre aide...

  7. #7
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 544
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 544
    Par défaut
    Je dirai qu'il manque un WHERE dans la requête...

    Tatayo.

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 039
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 039
    Billets dans le blog
    6
    Par défaut
    Le plus simple est de créer une vue qui fait l'union des 2 select A, B et select B, A. Puis de n'utiliser que cette vue
    À partir de là tout devient simple !

    A +

    PS : la plupart des développeurs ignorent l'usage des vues... C'est hélas catastrophique !
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 66
    Par défaut
    Bonjour,

    Merci pour votre aide. Finalement voici la requête que j'ai retenue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DISTINCT CASE WHEN "fkDescSource" = :EM THEN "fkDescCible" ELSE "fkDescSource" END "TA" 
    FROM "LesTA" 
    WHERE ( "fkDescSource" = :EM OR "fkDescCible" = :EM )
    J'ai fais un peu de refactoring sur mes tables aussi :
    LesTA : La table des termes associés = les termes VoirAussi
    fkDescSource et fkDescCible : les deux desripteurs du lien "Voir aussi'" dans la table LesTA.
    EM
    : le descripteur courant auquel on cherche les termes associés.

    Je n'ai pas utiliser de vue car sous LibreOffice j'ai compris dans l'aide qu'elle ne permet pas de mettre à jour les champs, elle est en lecture seule. Or ma table "Voir aussi" permet d'ajouter rapidement un nouvel élément.

    Je pense néanmoins revoir cette requête, je crois comprendre qu'elle pourrait aussi fonctionner avec des jointures...

Discussions similaires

  1. Tester l'existence d'un champ dans une requête
    Par Reidid dans le forum Access
    Réponses: 3
    Dernier message: 23/01/2006, 22h02
  2. Réponses: 9
    Dernier message: 17/10/2005, 17h13
  3. Pb de type de champs dans une requête
    Par djouahra.karim1 dans le forum Bases de données
    Réponses: 5
    Dernier message: 23/05/2005, 15h19
  4. Changement valeur d'un champ dans une requête
    Par Mimile28 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 07/04/2005, 14h28
  5. [SQL] Renommer un champ dans une requête
    Par martonpylon12 dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 15/11/2003, 01h59

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