Le 15/08/2012 19:11, Dominique_sextant a écrit :
> Bonjour,
>
> J'utilise le module Base de Libreoffice.
>
> Je sais très bien trouver les enregistrements communs à 2 tables. J'ai
> oublié comment on fait pour chercher les enregistrements de table1 qui ne
> sont pas dans table2 :
>
> Ma base est très simple, j'ai 2 tables : 2009 et 2010 avec chacune 3 champs
> : Compte, deb, cred
>
> Compte est de type texte (VARCHAR).
>
> Trouver tous les enregistrements de 2010 dont Compte n'a pas d'équivalent
> dans Compte de 2009
>
> Une réponse m'a été donnée sur un autre forum mais LIBO trébuche dessus :
> SELECT * FROM table1
>   WHERE table1.champs11 NOT IN (SELECT champ21 FROM table2);
>
> adaptée à mon cas :
>
> SELECT * FROM 2010
>   WHERE 2010.Compte NOT IN (SELECT Compte FROM 2009);
>
> J'ai systématiquement cette erreur :
>
> Statut SQL: HY000
> Code d'erreur: 1000
>
> syntax error, unexpected $end, expecting BETWEEN or IN or SQL_TOKEN_LIKE
>
> J'ai essayé de contourner la difficulté avec :
>
> SELECT 2009.Compte, 2009.deb, 2009.cred
>   FROM 2009 LEFT JOIN 2010
>     ON 2009.Compte = 2010.Compte
>     WHERE 2010.Compte IS NULL;
>
> Même punition !
>
> Ma base est ici : http://cjoint.com/?BHptjV9OhXL
>
> Je ne sais pas lire cette erreur et, surtout, je ne sais pas la résoudre.
>
> Merci et bonne journée à tous, 
>
>
>
> --
> View this message in context: 
> http://nabble.documentfoundation.org/Probleme-MySQL-dans-Base-LIBO-3-6-0-4-version-officielle-Ubuntu-12-04-tp4001566.html
> Sent from the Users mailing list archive at Nabble.com.
Bonjour ;

Je pense que ton problème vient de la manière de nommer tes tables. Sauf
erreur de ma part, il me semble qu'un nom de table (de base, de
champ...) peut commencer par un chiffre sous MySQL, mais doit
obligatoirement être encadré par des séparateurs s'il ne contient QUE
des chiffres, ce qui est ton cas ici. Ainsi, tes tables 2009 et 2010
devraient être écrites `2009` et `2010` (source :
http://dev.mysql.com/doc/refman/5.0/fr/legal-names.html).

La construction de ta requête avec NOT IN est parfaitement correcte,
elle n'est pas en cause et doit fonctionner. Elle peut juste être
optimisée en utilisant la clause DISTINCT dans la requête imbriquée, de
manière à ce qu'elle ne renvoie qu'une seule fois le numéro de chaque
compte présent dans la table de l'exercice précédent. Ce qui peut être
pratique si la table est volumineuse. La meilleure rédaction serait donc :

> SELECT * FROM `2010`
>   WHERE `2010`.`Compte` NOT IN (SELECT DISTINCT Compte FROM `2009`);

Cordialement ;

Marc Romano

-- 
Envoyez un mail à users+h...@fr.libreoffice.org pour savoir comment vous 
désinscrire
Les archives de la liste sont disponibles à 
http://listarchives.libreoffice.org/fr/users/
Tous les messages envoyés sur cette liste seront archivés publiquement et ne 
pourront pas être supprimés

Répondre à