Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/08/2011, 10h16   #1
Invité de passage
 
Inscription : avril 2009
Messages : 28
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 28
Points : 2
Points : 2
Par défaut un minus embêtant

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
nitho est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2011, 11h37   #2
Nouveau Membre du Club
 
Inscription : mai 2004
Messages : 56
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 56
Points : 32
Points : 32
Bonjour,

merci d'indiquer la version Oracle utilisée.

sinon, tu peux essayer quelque chose comme ça :
Code :
1
2
CREATE type varchar2_table AS TABLE of VARCHAR2(100);
SELECT * FROM TABLE(varchar2_table('donnee1', 'donnee2', 'donnee3'))
mise en ligne de tes valeurs, puis tu peux faire ton minus dessus.
Zugg est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2011, 12h29   #3
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 925
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Finance

Informations forums :
Inscription : décembre 2005
Messages : 2 925
Points : 4 547
Points : 4 547
quel intérêt? select from dual union va très bien!
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2011, 12h35   #4
Nouveau Membre du Club
 
Inscription : mai 2004
Messages : 56
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 56
Points : 32
Points : 32
C'est juste pour éviter de découper la chaine et de construire son SQL dynamiquement en fonction du nombre de valeurs découpées.

Code :
1
2
3
4
CREATE type varchar2_table AS TABLE of VARCHAR2(100);
SELECT * FROM TABLE(varchar2_table('donnee1', 'donnee2', 'donnee3'))
minus
SELECT champ1 FROM table1
Il suffit de remplacer 'donnee1', 'donnee2','donnee3' par la liste des valeurs sans besoin de faire du découpage et de la reconstruction du SQL
Zugg est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 31/08/2011, 15h56   #5
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 925
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Finance

Informations forums :
Inscription : décembre 2005
Messages : 2 925
Points : 4 547
Points : 4 547
tu découpes aussi 'donnee1,donnee2,donnee3' en en 'donnee1', 'donnee2', 'donnee3', non?
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/09/2011, 11h27   #6
Invité de passage
 
Inscription : avril 2009
Messages : 28
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 28
Points : 2
Points : 2
Trop cool Zugg, ça déchire ton truc.
En plus je compare des nombres donc je n'aurais pas à mettre d'apostrophes.

Par contre si ton type table avait plusieurs champs (colonnes) comment aurais-tu fais pour ajouter plusieurs lignes à ta table ?

Est-ce que ceci aurait marché par exemple

SELECT * FROM TABLE(varchar3_table(('donnee1', 'donnee2'), ('donnee3', 'donnee4') ))
avec les parenthèses pour délimiter les lignes ??? déjà au niveau de create type comment aurait-on renseigné les types de champs ??
nitho est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/09/2011, 11h40   #7
Invité de passage
 
Inscription : avril 2009
Messages : 28
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 28
Points : 2
Points : 2
Au fait j'ai Oracle database 10g Enterprise Edition Release 10.2.0.2.0
nitho est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/09/2011, 08h57   #8
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 925
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Finance

Informations forums :
Inscription : décembre 2005
Messages : 2 925
Points : 4 547
Points : 4 547
union all from dual a l'avantage d'être lisible, de ne pas avoir besoin d'objets, et d'être beaucoup plus rapide.

pour créer une collection d'enregistrement :

Code :
1
2
3
4
5
6
7
8
9
10
SQL> CREATE type t1 AS object(r1 number, r2 date);
Type created.
SQL> CREATE type t2 AS TABLE of t1;
Type created.
SQL> SELECT * FROM TABLE(t2(t1(1,sysdate),t1(2,sysdate+1)));
 
        R1 R2       
---------- ---------
         1 07-SEP-11
         2 08-SEP-11
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h54.


 
 
 
 
Partenaires

Hébergement Web