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

Recherche IF dans 2 tables


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2008
    Messages : 12
    Par défaut Recherche IF dans 2 tables
    Bonjour,

    Je dois faire une requête pour rechercher par rapport à un nom qu'on rentre, mais la recherche doit pouvoir se faire dans 2 tables.

    Explication :
    J'ai 2 tables : "Machine" et "Machine_alias"

    Table "Machine"
    • ID
    • NAME
    • ...


    Table "Machine_alias"
    • ID
    • MACHINE_ID (FK de Machine.id)
    • NAME
    • ...


    Le but de ma recherche est de rechercher dans un premier temps les "Machine_alias" qui correspondent au champs "NAME" et d'afficher le "Machine.NAME" qui correspond.
    Mais s'il n'y en a pas de rechercher dans la table "Machine" sous le champs "NAME".

    Exemple
    Machine
    • 1
    • Serveur1


    Machine_alias
    • 1 et 2
    • 1 et 1
    • Mars et Jupiter


    En recherchant : mar ou jup, il sera affiché Serveur1 ou en recherchant serv, il sera affichéer Serveur1.

    Merci de votre aide, je suis un peu perdu et embrouillé.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2008
    Messages : 12
    Par défaut
    Si ça peut aider, voici mon package, ainsi que la view que j'utilise en ce moment (la recherche ne se fait que sur la table "Machine" pour l'instant).

    Ma fonction du package (je n'ai mis que la partie qui concerne le machine name)
    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
    FUNCTION machine_search( pv_machine_name            In Varchar2
                          ) RETURN Sys_RefCursor
    IS
      wcur      Sys_RefCursor;
      wv_query  Varchar2(1000);
    BEGIN
     
      wv_query := 'SELECT DISTINCT id, name'        
      ;
     
        wv_query := wv_query||' FROM device_v device WHERE 1=1';
     
      IF pv_machine_name IS NOT NULL THEN
        dbms_session.set_context( 'WEB_CTX', 'machine_name', LOWER(pv_machine_name)||'%');
        wv_query := wv_query||' AND name LIKE SYS_CONTEXT(''WEB_CTX'', ''machine_name'')';
      END IF;
     
      wv_query := wv_query||' ORDER BY name';
     
    dbms_output.put_line(SUBSTR(wv_query, 1, 255));
    dbms_output.put_line(SUBSTR(wv_query, 256, 255));
    dbms_output.put_line(SUBSTR(wv_query, 511, 255));
     
      OPEN wcur FOR wv_query;
     
      RETURN wcur;
    END device_search;
    Et voici la vue utilisée (je l'utilise pour les autres éléments qui ne sont pas affichés) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE OR REPLACE VIEW DEVICE_V
    (ID, NAME, IS_EXTERNAL, DEVICE_TYPE_ID, DEVICE_TYPE_NAME, 
     MODEL_ID, MODEL_NAME, STRUCTURE_ID, STRUCTURE_NAME, SERIAL_NUMBER, 
     DEVICE_INVENTORY)
    AS 
    SELECT DISTINCT /* CM, 27-jan-2005 */
             machine.id
           , machine.name
        FROM machine, ...
       WHERE ("d'autres conditions")
    ORDER BY machine.name
    /
    D'après ce que j'ai trouvé, je pourrai utiliser un CASE dans mon cas, mais je ne vois pas où l'insérer et de quelle façon.

  3. #3
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 38
    Par défaut
    Bonjour,

    Ton exemple n'est pas clair, à quoi correspondent exactement les éléments des listes
    Machine
    • 1
    • Serveur1

    Machine_alias
    • 1 et 2
    • 1 et 1
    • Mars et Jupiter
    Sinon en méthode brutal faire la première requête et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    IF %ROWCOUNT > 0 THEN retturn la_valeur_qui_va_bien 
    ELSE requete dans la table MACHINE
    C'est l'idée je pense que qqun repassera derrière pour remettre tout ca en place

    Bonne journée

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2008
    Messages : 12
    Par défaut
    L'exemple concerne les valeurs des champs :

    Table Machine :
    • ID = 1
    • NAME = Serveur1


    Table Machine_alias:
    • ID = 1 (et ID = 2 pour 2ème enregistrement)
    • MACHINE_ID = 1 (et MACHINE_ID = 2)
    • NAME = Mars (et NAME = Jupiter)


    Voila j'espère que c'est plus clair. Je vais essayer ta technique, merci.

  5. #5
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 38
    Par défaut
    Ok l'exemple est plus clair en effet, la prochaine met directement copie-colle la sortie écran des select associés (on peut avoir le schéma des tables par la même occasion).
    Bonne chance en tout cas et désolé de ne pas pouvoir t'aider plus

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 316
    Par défaut
    si un même nom ne peut pas se trouver dans les deux tables
    tu peux peut-être utilisé quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select machine.name as nom from machine_alias,machine
    where machine.id=machine_alias.id
      and lower(machine_alias.name) like 'mar%'
    union
    select machine.name as nom from machine
    where  lower(machine.name) like 'mar%';
    Désolé mais je n'ai pas le temps de tester le code c'est juste pour donner
    une piste

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

Discussions similaires

  1. Recherche conditionnée dans une table
    Par doolar dans le forum Bases de données
    Réponses: 6
    Dernier message: 24/03/2008, 21h17
  2. recherche automatique dans une table
    Par jesuisjosita dans le forum Access
    Réponses: 3
    Dernier message: 15/01/2007, 11h44
  3. [WinDev 10] Recherche multicritères dans une table
    Par Gonelle dans le forum WinDev
    Réponses: 4
    Dernier message: 19/07/2006, 14h50
  4. Rechercher minuscule dans une table
    Par pmonn dans le forum Access
    Réponses: 3
    Dernier message: 25/10/2004, 14h53

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