Partage
  • Partager sur Facebook
  • Partager sur Twitter

Un minus sous oracle

    30 août 2011 à 12:10:36

    Bonjour à tous,

    dites j'ai une liste de données qui me viennent sous la forme:
    "donnee1, donnee2, donnee3"

    et j'aimerais savoir laquelle de ces données ne se trouve pas dans un certain champ d'une table.

    j'aurais aimé pouvoir faire:

    select donnee1, donnee2, donnee3 from dual
    minus
    select champ1 from table1

    mais ça ne marche pas parceque les données de la première partie se classent en colonne plutôt qu'en ligne. J'ai pensé à faire :


    select donnee1 from dual union
    select donnee2 from dual union
    select donnee3 from dual minus
    select champ1 from table1

    et là ça marche même s'il m'a fallu couper ma chaine pour récupérer donnee1, donnee2 et donnee3. Est-ce que quelqu'un aurait une autre idée ?


    Merci d'avance
    • Partager sur Facebook
    • Partager sur Twitter
      30 août 2011 à 12:28:02

      Essaye :

      SELECT donnee1, donnee2, donnee3
      FROM dual
      WHERE NOT EXISTS (
          SELECT *
          FROM table1
          WHERE table1.champ1 = dual.donnee1
          OR table1.champ1 = dual.donnee2
          OR table1.champ1 = dual.donnee3
      )
      
      • Partager sur Facebook
      • Partager sur Twitter
        30 août 2011 à 22:00:18

        Oui ça marchera certainement mais là aussi on doit couper la chaine, et en plus ce que j'ai oublié de dire c'est que je ne sais pas d'avance combien d'élément il y a dans la chaine. finalement ce n'est pas plus simple que de faire des unions... Merci pour ta réponse ça me remotive :)
        • Partager sur Facebook
        • Partager sur Twitter
          30 août 2011 à 22:12:31

          1) Tu insères les données dans une table (éventuellement temporaire)
          2) Tu utilises un left join

          SELECT TMP.donnee 
          FROM ma_table_temporaire_de_donnees  TMP
          LEFT JOIN table1 T1 ON TMP.donnee = T1.champ1 
          WHERE T1.champ1 IS NULL
          


          cqfd ;)
          • Partager sur Facebook
          • Partager sur Twitter
            31 août 2011 à 19:49:08

            SQL> create table table1(champ varchar2(10));
            
            Table created.
            
            SQL> insert into table1 values('donnee2');
            
            1 row created.
            
            SQL> insert into table1 values('donnee4');
            
            1 row created.
            
            SQL> variable ma_liste varchar2(50)
            SQL> begin
              2    :ma_liste := 'donnee1,donnee2,donnee3';
              3  end;
              4  /
            
            PL/SQL procedure successfully completed.
            
            SQL> select trim(substr(liste, 1 + instr(liste, ',', 1, rn),
              2  			  instr(liste, ',', 1, rn + 1)
              3  			  - instr(liste, ',', 1, rn) - 1)) manquant
              4  from (select rownum rn,
              5  		  ',' || trim(',' from liste) || ',' liste
              6  	   from (select :ma_liste liste
              7  		 from dual)
              8  	   connect by level <=	1 + length(liste)
              9  			    - length(replace(liste, ',', '')))
             10  minus
             11  select champ
             12  from table1
             13  /
            
            MANQUANT
            --------------------------------------------------------------------------------
            donnee1
            donnee3
            
            SQL> begin
              2    :ma_liste := 'donnee1,donnee2,donnee3,donnee4,donnee5';
              3  end;
              4  /
            
            PL/SQL procedure successfully completed.
            
            SQL> select trim(substr(liste, 1 + instr(liste, ',', 1, rn),
              2  			  instr(liste, ',', 1, rn + 1)
              3  			  - instr(liste, ',', 1, rn) - 1)) manquant
              4  from (select rownum rn,
              5  		  ',' || trim(',' from liste) || ',' liste
              6  	   from (select :ma_liste liste
              7  		 from dual)
              8  	   connect by level <=	1 + length(liste)
              9  			    - length(replace(liste, ',', '')))
             10  minus
             11  select champ
             12  from table1
             13  /
            
            MANQUANT
            --------------------------------------------------------------------------------
            donnee1
            donnee3
            donnee5
            
            SQL>
            
            • Partager sur Facebook
            • Partager sur Twitter
              7 septembre 2011 à 18:10:09

              Je comprends pas grand chose à ce code .... Peux tu y ajouter des commentaires ???
              • Partager sur Facebook
              • Partager sur Twitter

              Un minus sous oracle

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown