Problème MySQL dans Base (LIBO 3.6.0.4 version officielle, Ubuntu 12.04)

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,

Bonsoir,

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);

presque :wink:

select * from "2010"
where NOT "Compte" IN ( select distinct "Compte" from "2009")

te donnera ce que tu souhaites :wink:

Yves

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

Bonjour,

Je te remercie. Apparemment l'essentiel de mes problèmes tenait au fait que
mes tables n'avaient que des caractères numériques dans leur nom. J'ai
ajouté un « T » dedans et tout est rentré dans l'ordre avec cette syntaxe :

SELECT * FROM "T2010" WHERE NOT "Compte" IN ( SELECT "Compte" FROM "T2009" )

Mais ta syntaxe, adaptée au nouveau libellé de mes tables, fonctionne aussi
très bien :

SELECT * FROM "T2010" WHERE NOT "Compte" IN ( SELECT DISTINCT "Compte" FROM
"T2009" )

Quel est l'utilité de « DISTINCT » ?

Le fait de transformer les libellés des tables en texte (T2010, T2009...)
permet de s'affranchir des guillemets :

SELECT * FROM T2010 WHERE NOT Compte IN ( SELECT DISTINCT Compte FROM T2009
)

fonctionne aussi très bien. Quel est l'utilité des guillemets ? Tourner la
difficulté des noms de tables et de champs qui pourraient n'être que
numériques ?

Merci et bonne journée,

Dominique

Bonjour,

Je te remercie. Apparemment l'essentiel de mes problèmes tenait au fait que
mes tables n'avaient que des caractères numériques dans leur nom. J'ai
ajouté un « T » dedans et tout est rentré dans l'ordre avec cette syntaxe :

SELECT * FROM "T2010" WHERE NOT "Compte" IN ( SELECT "Compte" FROM "T2009" )

Mais ta syntaxe, adaptée au nouveau libellé de mes tables, fonctionne aussi
très bien :

SELECT * FROM "T2010" WHERE NOT "Compte" IN ( SELECT DISTINCT "Compte" FROM
"T2009" )

Quel est l'utilité de « DISTINCT » ?

Le fait de transformer les libellés des tables en texte (T2010, T2009...)
permet de s'affranchir des guillemets :

SELECT * FROM T2010 WHERE NOT Compte IN ( SELECT DISTINCT Compte FROM T2009
)

fonctionne aussi très bien. Quel est l'utilité des guillemets ? Tourner la
difficulté des noms de tables et de champs qui pourraient n'être que
numériques ?

Merci et bonne journée,

Dominique

Bonjour,
DISTINCT permet la sélection d'un unique item
les guillemets signalent le début et la fin du nom d'un champ, sans guillemet, le premier espace du nom du champ est interprété comme fin du nom.
Si tu veux en savoir plus, le guide HSQLDB a été traduit ici : http://wiki.openoffice.org/wiki/Fr.openoffice.org/FAQ/Base/Guide_HSQLDB
Le guide pour le HSQLDB version 2.2 n'a pas été traduit : il faut suivre les liens ici
http://wiki.documentfoundation.org/FR/Base/HSQLDB_Guide_2.2#D.C3.A9marrer_et_utiliser_HSQL
J.M

Je vous remercie pour votre aide.

J'ai compris DISTINCT. Au cas particulier de mes balances, les occurrences
sont peu nombreuse et je devrais pouvoir m'en affranchir.

En revanche, ça pourra m'être très utile lorsque je dois chercher des sommes
similaires (plusieurs dizaines de milliers...) afin de voir si une recette
d'un côté ne solderait par un titre de l'autre. Ça concerne la gestion
comptable d'un hôpital public où les virements sur mon compte BdF se
chiffrent en milliers de lignes pas forcément aisées à rapprocher de titres
émis par l'hôpital... Alors parfois, un tel rapprochement « brutal » trouve
des résultats intéressants.

En revanche, c'est inutile pour les sommes semblables (part mutuelle pour
une simple consultation, par exemple où les similitudes sont de plusieurs
milliers).

Les joies de la comptabilité publique :slight_smile:

Bonne journée et merci encore,

Dominique