Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

WD12 - Accès natif MySQL 4

6 réponses
Avatar
I.G.LOG
Bonjour,

Je voudrais editer les stocks non mouvementes pour une période donnée, cad
les lignes stock pour lesquelle je ne trouve pas de mouvement.
J'ai deux tables:
DOCUMLG qui contient les lignes stock
MOUVEMENT qui contient les mouvements, avec l'origine, la destination et la
date.

Le principe de la requete est de rechercher les lignes de stock qui n'ont
aucune entrée ni sortie (donc l'identifiant IDDOCUMLG n'est pas trouvé ni en
orgiine ni en destination dans la table mouvement)
J'execute cette requete qui fonctionne sur mon poste de dév. mais PAS chez
mon client.
La seule différence est la version de MySQL qui est 4.1.9 chez le client et
4.1.22 sur mon poste.

Voici la requete:

select
IDDOCUM,IDARTICLE,DESIGNATION,REFCONST,ETAT,QTEREST,PRIX
from
DOCUMLG
where IDDOCUM in (3) // Identifiant du stock
and QTEREST <> 0 // uniquement les stocks non vides
and IDDOCUMLG not in (select DESTINATION from MOUVEMENT where DATEMVT
between '20060501' AND '20090227')
and IDDOCUMLG not in (select ORIGINE from MOUVEMENT where DATEMVT between
'20060501' AND '20090227')
order by REFCONST,ETAT

Par ailleurs, connaissez vous une syntaxe qui permettrait de faire un seul
NOT IN, du genre :

...
and IDDOCUMLG not in (select ORIGINE,DESTINATION from ...)
...

Nota: j'ai essayé cette syntaxe, elle génère une erreur

Merci à tous

6 réponses

Avatar
Firetox
Bonjour,

sur votre requete il n'y a pas d'ordre SQL qui ferait que la version puisse
faire cela
mais disons que chez votre client il y a plus de mouvement et la requete
rame

il y a plusieurs possibilite pour faire cette requete sans les select
imbriqués qui prennent du temps
// ----------------------------------------------------------------------------------------------
// solution 1
SELECT
DOCUMLG.IDDOCUM,IDARTICLE,DESIGNATION,REFCONST,ETAT,QTEREST,PRIX
FROM
DOCUMLG
LEFT JOIN MOUVEMENT MvOri ON MvOri.DESTINATION = DOCUMLG.IDDOCUMLG
AND DATEMVT
between '20060501' AND '20090227'
LEFT JOIN MOUVEMENT MvDes ON MvDes.ORIGINE = DOCUMLG.IDDOCUMLG
AND DATEMVT
between '20060501' AND '20090227'
where IDDOCUM in (3) // Identifiant du stock
and QTEREST <> 0 // uniquement les stocks non vides
and MvOri.DESTINATION is null
and MvDes.ORIGINE is null
order by REFCONST,ETAT

// ----------------------------------------------------------------------------------------------
// solution 2 : je pense plus lente
select
IDDOCUM,IDARTICLE,DESIGNATION,REFCONST,ETAT,QTEREST,PRIX
from
DOCUMLG
where IDDOCUM in (3) // Identifiant du stock
and QTEREST <> 0 // uniquement les stocks non vides
and IDDOCUMLG not in (
select DESTINATION from MOUVEMENT where DATEMVT between '20060501'
AND '20090227'
UNION
select ORIGINE from MOUVEMENT where DATEMVT between '20060501' AND
'20090227'
)
order by REFCONST,ETAT

a tester

Bon dev
@+

"I.G.LOG" a écrit dans le message de news:
49a7f2ae$0$2760$
Bonjour,

Je voudrais editer les stocks non mouvementes pour une période donnée, cad
les lignes stock pour lesquelle je ne trouve pas de mouvement.
J'ai deux tables:
DOCUMLG qui contient les lignes stock
MOUVEMENT qui contient les mouvements, avec l'origine, la destination et
la date.

Le principe de la requete est de rechercher les lignes de stock qui n'ont
aucune entrée ni sortie (donc l'identifiant IDDOCUMLG n'est pas trouvé ni
en orgiine ni en destination dans la table mouvement)
J'execute cette requete qui fonctionne sur mon poste de dév. mais PAS chez
mon client.
La seule différence est la version de MySQL qui est 4.1.9 chez le client
et 4.1.22 sur mon poste.

Voici la requete:

select
IDDOCUM,IDARTICLE,DESIGNATION,REFCONST,ETAT,QTEREST,PRIX
from
DOCUMLG
where IDDOCUM in (3) // Identifiant du stock
and QTEREST <> 0 // uniquement les stocks non vides
and IDDOCUMLG not in (select DESTINATION from MOUVEMENT where DATEMVT
between '20060501' AND '20090227')
and IDDOCUMLG not in (select ORIGINE from MOUVEMENT where DATEMVT between
'20060501' AND '20090227')
order by REFCONST,ETAT

Par ailleurs, connaissez vous une syntaxe qui permettrait de faire un seul
NOT IN, du genre :

...
and IDDOCUMLG not in (select ORIGINE,DESTINATION from ...)
...

Nota: j'ai essayé cette syntaxe, elle génère une erreur

Merci à tous



Avatar
I.G.LOG
"Firetox" a écrit dans le message de news:
49a8130e$0$3555$
Bonjour,

sur votre requete il n'y a pas d'ordre SQL qui ferait que la version
puisse faire cela
mais disons que chez votre client il y a plus de mouvement et la requete
rame




Bonjour
J'ai a peu près la même base chez le client que sur mon poste de dév. C'est
pour ça que je ne comprends pas que ca fonctionne chez moi et pas chez lui
(j'avais donc pensé à la diff. de version MySQL qui, nous l'avons vu
ensemble sur un pb précédent, peut donner des résultats disons "aléatoires")
Et chez moi la requete retourne les résultats en moins d'une seconde
(222029 tuples dans 'mouvement', 663445 dans 'documlg')

il y a plusieurs possibilite pour faire cette requete sans les select
imbriqués qui prennent du temps
// ----------------------------------------------------------------------------------------------
// solution 1
SELECT
DOCUMLG.IDDOCUM,IDARTICLE,DESIGNATION,REFCONST,ETAT,QTEREST,PRIX
FROM
DOCUMLG
LEFT JOIN MOUVEMENT MvOri ON MvOri.DESTINATION = DOCUMLG.IDDOCUMLG
AND
DATEMVT between '20060501' AND '20090227'
LEFT JOIN MOUVEMENT MvDes ON MvDes.ORIGINE = DOCUMLG.IDDOCUMLG
AND
DATEMVT between '20060501' AND '20090227'
where IDDOCUM in (3) // Identifiant du stock
and QTEREST <> 0 // uniquement les stocks non vides
and MvOri.DESTINATION is null
and MvDes.ORIGINE is null
order by REFCONST,ETAT




Test sur ma base locale: 0,31 sec.

// ----------------------------------------------------------------------------------------------
// solution 2 : je pense plus lente
select
IDDOCUM,IDARTICLE,DESIGNATION,REFCONST,ETAT,QTEREST,PRIX
from
DOCUMLG
where IDDOCUM in (3) // Identifiant du stock
and QTEREST <> 0 // uniquement les stocks non vides
and IDDOCUMLG not in (
select DESTINATION from MOUVEMENT where DATEMVT between '20060501'
AND '20090227'
UNION
select ORIGINE from MOUVEMENT where DATEMVT between '20060501' AND
'20090227'
)
order by REFCONST,ETAT

a tester




Test sur ma base locale: 0,36 sec.
Je testerais tout ça chez mon client

Par ailleurs, connaissez vous une syntaxe qui permettrait de faire un
seul NOT IN, du genre :

...
and IDDOCUMLG not in (select ORIGINE,DESTINATION from ...)
...

Nota: j'ai essayé cette syntaxe, elle génère une erreur






J'ai essayé avec
...
AND FIND_IN_SET(CAST(IDDOCUMLG as CHAR),(SELECT
CONCAT_WS(","ORIGINE,DESTINATION) from mouvement WHERE DATEMVT between
'20060501' AND '20090227')) = 0
...

mais j'ai un erreur 1424 (plus d'une colonne) que je ne comprends pas (quand
je le lance (select concat_ws(...) ca me retourne bien une seule colonne !!)


Encore un grand merci à toi pour tes conseils éclairés !!!
Avatar
Firetox
> J'ai a peu près la même base chez le client que sur mon poste de dév.
C'est pour ça que je ne comprends pas que ca fonctionne chez moi et pas
chez lui (j'avais donc pensé à la diff. de version MySQL qui, nous l'avons
vu ensemble sur un pb précédent, peut donner des résultats disons
"aléatoires")
Et chez moi la requete retourne les résultats en moins d'une seconde
(222029 tuples dans 'mouvement', 663445 dans 'documlg')




verifie quand meme les libmySQL.dll quis ont sur les postes
elle est installé ou ? (dans le rep de l'appli ou windows ?)

peut etre a cause du sous select
la requete 1 devrait te montrer ci cela vient de la puisqu"elle n'a pas de
sous select
Avatar
I.G.LOG
"Firetox" a écrit dans le message de news:
49a81f38$0$18745$
J'ai a peu près la même base chez le client que sur mon poste de dév.
C'est pour ça que je ne comprends pas que ca fonctionne chez moi et pas
chez lui (j'avais donc pensé à la diff. de version MySQL qui, nous
l'avons vu ensemble sur un pb précédent, peut donner des résultats disons
"aléatoires")
Et chez moi la requete retourne les résultats en moins d'une seconde
(222029 tuples dans 'mouvement', 663445 dans 'documlg')




verifie quand meme les libmySQL.dll quis ont sur les postes
elle est installé ou ? (dans le rep de l'appli ou windows ?)




les libmysql.dll sont dans le rép. de l'appli
Je vais vérifier les versions de ces dll dès que je suis chez le client
(mardi prochain)
je te tiens au courant dès que j'ai la solution
Encore merci


peut etre a cause du sous select
la requete 1 devrait te montrer ci cela vient de la puisqu"elle n'a pas de
sous select






oui je vais de toute façon essayer avec cette requete 1 qui semble plus
performante que la mienne (qui a deux sous-select NOT IN)
Avatar
I.G.LOG
Bonjour,
Sur mon poste de dév., en mode réel (l'appli installée sur c:program
filesprog) la requete ne fonctionne pas. En mode test, ça fonctionne ?!
Je viens de vérifier les libmysql.dll: la version installée sur
c:MySQLMySQL Server 4.1 est bien la même que celle installée dans le rép.
de l'exécutable, cad version du 6/11/2006 (1160 Ko). Je ne comprends donc
pas pourquoi ca fonctionne en test et pas en réel. Je pense donc vraiment à
une différence au niveau du serveur (en réel j'attaque la base sur le
serveur qui est en 4.1.9 sur Linux alors qu'en test j'ai la version 4.1.22)
J'ai modifié la requète comme tu me l'as indiqué (req. n° 1) et là tout
fonctionne !!!
Encore un grand merci à toi
Avatar
Firetox
Bonjour,

J'ai modifié la requète comme tu me l'as indiqué (req. n° 1) et là tout
fonctionne !!!
Encore un grand merci à toi



oui je pense qu'il y a quelque chose sur les ous requete entre les version
19 et 22
c'est pour cela que j'evite au maxi les sous requetes. sinon il faut
verifier que cela fonctionne sur les differentes install

Bon dev
@+