Notices sans exemplaire

Énoncé

Je recherche toutes les notices sans exemplaire.

Essai 1

La table EXEMPLAIRE a un champ lié à la table UNIMARC. Ce champ s'appelle LIVRE.
Je fais l'hypothèse que le champ auquel LIVRE est lié est DORIS_KEY de UNIMARC (la clé primaire).

La requête SQL sera donc :

select unimarc.doris_key,exemplaire.livre
from unimarc,exemplaire
where unimarc.doris_key=exemplaire.livre(+);

Noter la manière de faire une jointure externe à gauche (left outer join) en mettant simplement un (+) à droite !

Ça marche, mais il faut aussi envoyer le résultat dans un fichier texte :

spool /user/local/loris/exemplaire.log
select unimarc.doris_key,exemplaire.livre
from unimarc,exemplaire
where unimarc.doris_key=exemplaire.livre(+);
spool off

C'est pas mal, mais les données ne sont pas tabulées : le formatage par défaut ne permet pas de retravailler le fichier dans un tableur.

2. Formater pour faciliter les traitements ultérieurs

Il suffit d'ajouter la commande set colsep ';' (ou tout autre délimmiteur).

Voici un exemple de script sql qui génère un fichier dont le séparateur de colonne est un ';'

set recsep off
set colsep ';'
set trims on
set term off
spool /user/local/loris/exemplaire2.log
select unimarc.doris_key,exemplaire.livre
from unimarc,exemplaire
where unimarc.doris_key=exemplaire.livre(+);
spool off
set trims on
cela enlève les espaces en fin de ligne
set term off
cela permet de ne rien renvoyer à l'écran.

Il reste quand même un inconvénient : Excel ne peut pas ouvrir un fichier aussi énorme, et OpenOffice ne gère pas ce type de conversion.
Avec Perl, aucun problème.

3. Essai2

La requête suivante est plus simple :

select unimarc.doris_key,exemplaire.livre
from unimarc,exemplaire
where unimarc.doris_key=exemplaire.livre(+)
and exemplaire.livre is null;

4. Essai3

Il faut aussi éliminer les notices de commande et les notices des documents électroniques.

set heading off
spool /user/local/loris/filip/ssexemplaire.log
select unimarc.doris_key
from unimarc,exemplaire
where unimarc.doris_key=exemplaire.livre(+)
and exemplaire.livre is null
and (unimarc.unimarc1!=2) and not (unimarc.unimarc8 = 8);
spool off

Quelques bons liens sur le formatage et sur SQLPlus :
http://www.ss64.com/orasyntax/plus_set.html
http://www.psoug.org/reference/sqlplus.html

Forums :
http://didier.deleglise.free.fr/w-agora/index.php?site=oracle