PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → rêquete sql soucis ;-(
rêquete sql soucis ;-(
Débuté par agidrol, 03 nov. 2005 15:58 - 14 réponses
Posté le 03 novembre 2005 - 15:58
Bonjour, en acces natif sur une base mysql,
j'arrive pas à faire cette requete, pourtant je ne pense pas me tromper...

select personne.id_per
from personne
where personne.id_per not in ( select carte.id_per from carte where
carte.id_per = personne.id_per)

J'essai de retrouver les 'personnes' , qui ne possedent pas de 'carte'

et j'ai comme réponse du serveur :

#1064 - You have an error in your SQL syntax. Check the manual that
corresponds to your MySQL server version for the right syntax to use near
'select carte . id_per from carte where carte . id_per = personn

une idée

par avance grand merci.

Antoine
Posté le 03 novembre 2005 - 16:06
salut

ça me semble correct à moi aussi pourtant l'instruction Not Exist est plus rapide que Not in
Posté le 03 novembre 2005 - 18:21
aucun des 2 ne fonctionne de toute facon, je ne comprends pas pourquoi ;-(


"YORK" <guest@newsgroup.fr> a écrit dans le message de news:
436a216f$1@news.pcsoft.fr...



salut

ça me semble correct à moi aussi pourtant l'instruction Not Exist est
plus rapide que Not in
Posté le 03 novembre 2005 - 18:40
Antoine GIDROL a écrit :
Bonjour, en acces natif sur une base mysql,
j'arrive pas à faire cette requete, pourtant je ne pense pas me tromper...

select personne.id_per
from personne
where personne.id_per not in ( select carte.id_per from carte where
carte.id_per = personne.id_per)

J'essai de retrouver les 'personnes' , qui ne possedent pas de 'carte'

et j'ai comme réponse du serveur :

#1064 - You have an error in your SQL syntax. Check the manual that
corresponds to your MySQL server version for the right syntax to use near
'select carte . id_per from carte where carte . id_per = personn


la syntaxe semble correcte... as-tu essayé cette requète en direct sous
mysql ?

la requète ci-dessous fonctionne bien en mysql direct (version 4.1.10.a) :
select caissiers.id_caissier, libelle from caissiers where
caissiers.id_caissier not in (select caissiers_encours.id_caissier from
caissiers_encours)


--
Jacques Trepp
Albygest - 81160 - St Juery
jacques-pas de spam.trepp@free.fr
(enlever '-pas de spam' pour me joindre)
http://www.albygest.com
Posté le 04 novembre 2005 - 08:44
La différence entre ta requête et la sienne est que dans ton cas, la sous-requête n'est pas correlée. Peut-être que la version de MySql utilisée ne supporte pas les sous-requêtes corrélées.
Tu peux faire le test avec cette requête:
select caissiers.id_caissier, libelle from caissiers where
not exists (select * from
caissiers_encours where caissier_encours.is_caissier = caissiers.id_caissier )

Frédéric.
Posté le 04 novembre 2005 - 09:07
Bonjour,

Si mes souvenir sont bons, un Select dans un select ne fonctionne qu'à partir de la version MySql 4.1
Peut-être es-tu sur une version plus ancienne ?

Maintenant quand à savoir si l'accès Natif interpretre ta requête correctement....

Nous avons recontré d'autres problèmes avec cet accès natif.....et toi ?

N'hésite pas à me contacter

pas-de-spam-fred-76@hotmail.com (en enlevant 'pas-de-spam-')

Fred
Posté le 04 novembre 2005 - 09:21
Bonjour,

oui, j'ai bien entendu essayer directement sur le serveur mysql, mais elle
ne fonctionne pas.
la version est 4.0.22 d'apres ce que je sais sur le serveur de l'hébergeur.

je viens de tester ceci aussi histoire de voir.....

mais marche pas non plus.

SELECT personne.id_per
FROM personne
WHERE personne.id_per NOT
IN ( SELECT carte.id_per FROM carte)

Antoine




"jackt81" <jacques.trepp-nospam@free.fr> a écrit dans le message de news:
436a385c$1@news.pcsoft.fr...

Antoine GIDROL a écrit :
Bonjour, en acces natif sur une base mysql,
j'arrive pas à faire cette requete, pourtant je ne pense pas me
tromper...

select personne.id_per
from personne
where personne.id_per not in ( select carte.id_per from carte where
carte.id_per = personne.id_per)

J'essai de retrouver les 'personnes' , qui ne possedent pas de 'carte'

et j'ai comme réponse du serveur :

#1064 - You have an error in your SQL syntax. Check the manual that
corresponds to your MySQL server version for the right syntax to use near
'select carte . id_per from carte where carte . id_per = personn


la syntaxe semble correcte... as-tu essayé cette requète en direct sous
mysql ?

la requète ci-dessous fonctionne bien en mysql direct (version 4.1.10.a) :
select caissiers.id_caissier, libelle from caissiers where
caissiers.id_caissier not in (select caissiers_encours.id_caissier from
caissiers_encours)


--
Jacques Trepp
Albygest - 81160 - St Juery
jacques-pas de spam.trepp@free.fr
(enlever '-pas de spam' pour me joindre)
http://www.albygest.com
Posté le 04 novembre 2005 - 09:56
Oui, comme je te disais, les Select dans un Select ne sont supporté qu'à partir de MySql 4.1 et tu n'es qu'à la 4.0.22....

Peut-être que tu devrais tenter l'upgrade de ton MySql (l'ennuie c'est que ton hébergeur ne le fera peut-être pas)...

As-tu l'occasion de tester ta requête sur Une version MySql >= 4.1 ?

-----------------------------------------------------------------------

Je profites de ton message (comme tu semble t'y connaitre un peu) car j'ai un soucis avec une requête et je ne trouve pas la solution :

un fichier stock contenant : id_stock - ref - description

1 - 4444 - roulement
2 - 5555 - Ecrou
3 - 6666 - Cable

Un fichier historique des ventes : (id_histo - id_stock - movedate - price)

1 - 1 - 20050101 - 20,65
2 - 2 - 20050203 - 1,35
3 - 1 - 20050215 - 20,75
4 - 3 - 20050116 - 10,50
5 - 2 - 20050501 - 1,40
6 - 2 - 20050604 - 1,45
7 - 3 - 20050116 - 10,65
8 - 1 - 20050420 - 20,90

Et j'ai besoin de retrouver une ligne par article correspondant à la dernière vnte de celui-ci

Soit :

1 - 20050420 - 20,90
2 - 20050604 - 1,45
3 - 20050116 - 10,65

Lorsque je fais ma requête, j'utilise la selection sur le MAX de mon movedate et un GROUP BY sur le id_stock

Le problème c'est que le id_histo et price ne sont pas retournés à cause du GROUP BY.

Une solution ?

Merci d'avance

Fred
Posté le 04 novembre 2005 - 10:51
Une idée comme ça au passage... Est ce qu'une sous requête comme ton
select servant pour le not in n'est pas effectuée avant la requête
extérieure? Parce que dans ce cas, il manque simplement la jointure avec
ta table personne : not in (select carte.id_per from carte, PERSONNE
where carte.id_per = personne.id_per)
sinon, dans la requête, personne.id_per est considéré comme une variable
non?
Enfin, je suis loin d'être une pro en sql donc c'était juste un idée
comme ça hein...

Céline.

Antoine GIDROL a écrit:
Bonjour, en acces natif sur une base mysql,
j'arrive pas à faire cette requete, pourtant je ne pense pas me tromper...

select personne.id_per
from personne
where personne.id_per not in ( select carte.id_per from carte where
carte.id_per = personne.id_per)

J'essai de retrouver les 'personnes' , qui ne possedent pas de 'carte'

et j'ai comme réponse du serveur :

#1064 - You have an error in your SQL syntax. Check the manual that
corresponds to your MySQL server version for the right syntax to use near
'select carte . id_per from carte where carte . id_per = personn

une idée

par avance grand merci.

Antoine


Posté le 04 novembre 2005 - 11:43
Antoine GIDROL a écrit :
Bonjour,

oui, j'ai bien entendu essayer directement sur le serveur mysql, mais elle
ne fonctionne pas.
la version est 4.0.22 d'apres ce que je sais sur le serveur de l'hébergeur.

je viens de tester ceci aussi histoire de voir.....

mais marche pas non plus.

SELECT personne.id_per
FROM personne
WHERE personne.id_per NOT
IN ( SELECT carte.id_per FROM carte)

Antoine



hum...
je ne suis pas certain que la version 4.0 accepte les requètes imbriquées.


--
Jacques Trepp
Albygest - 81160 - St Juery
jacques-pas de spam.trepp@free.fr
(enlever '-pas de spam' pour me joindre)
http://www.albygest.com
Posté le 04 novembre 2005 - 11:45
Je pense que c'est un probleme de version mysql oui.
Et il est vrai que le fait d'etre heberger me bloque , mais bon, j'ai
utilisé une solution
que je considère pas géniale, mais qui fonctionne.

select personne.id_per
from personne left join carte on personne.id_per=carte.id_per
where carte.id_per is null

Merci à tous pour vos réponses.


concernant la question de fred, je ferai un truc dans ce genre :

select stock.id_stock , stock.ref , stock.description, ventes.id_histo ,
ventes.id_stock ,ventes.movedate ,ventes.price
from stock, ventes
where stock.id_stock = ventes.id_stock
and ventes.movedate = (select max(v2.movedate) from ventes v2 where
v2.id_stock = ventes.id_stock)

J'espere avoir bien répondu à ta question.

cordialement


Antoine



"Fred" <fred-76@hotmail.com> a écrit dans le message de news:
436b1c28$1@news.pcsoft.fr...

Oui, comme je te disais, les Select dans un Select ne sont supporté qu'à
partir de MySql 4.1 et tu n'es qu'à la 4.0.22....

Peut-être que tu devrais tenter l'upgrade de ton MySql (l'ennuie c'est que
ton hébergeur ne le fera peut-être pas)...

As-tu l'occasion de tester ta requête sur Une version MySql >= 4.1 ?

-----------------------------------------------------------------------

Je profites de ton message (comme tu semble t'y connaitre un peu) car j'ai
un soucis avec une requête et je ne trouve pas la solution :

un fichier stock contenant : id_stock - ref - description

1 - 4444 - roulement
2 - 5555 - Ecrou
3 - 6666 - Cable

Un fichier historique des ventes : (id_histo - id_stock - movedate -
price)

1 - 1 - 20050101 - 20,65
2 - 2 - 20050203 - 1,35
3 - 1 - 20050215 - 20,75
4 - 3 - 20050116 - 10,50
5 - 2 - 20050501 - 1,40
6 - 2 - 20050604 - 1,45
7 - 3 - 20050116 - 10,65
8 - 1 - 20050420 - 20,90

Et j'ai besoin de retrouver une ligne par article correspondant à la
dernière vnte de celui-ci

Soit :

1 - 20050420 - 20,90
2 - 20050604 - 1,45
3 - 20050116 - 10,65

Lorsque je fais ma requête, j'utilise la selection sur le MAX de mon
movedate et un GROUP BY sur le id_stock

Le problème c'est que le id_histo et price ne sont pas retournés à cause
du GROUP BY.

Une solution ?

Merci d'avance

Fred
Posté le 04 novembre 2005 - 11:48
Fred a écrit :
Oui, comme je te disais, les Select dans un Select ne sont supporté qu'à partir de MySql 4.1 et tu n'es qu'à la 4.0.22....

Peut-être que tu devrais tenter l'upgrade de ton MySql (l'ennuie c'est que ton hébergeur ne le fera peut-être pas)...

As-tu l'occasion de tester ta requête sur Une version MySql >= 4.1 ?

-----------------------------------------------------------------------

Je profites de ton message (comme tu semble t'y connaitre un peu) car j'ai un soucis avec une requête et je ne trouve pas la solution :

un fichier stock contenant : id_stock - ref - description

1 - 4444 - roulement
2 - 5555 - Ecrou
3 - 6666 - Cable

Un fichier historique des ventes : (id_histo - id_stock - movedate - price)

1 - 1 - 20050101 - 20,65
2 - 2 - 20050203 - 1,35
3 - 1 - 20050215 - 20,75
4 - 3 - 20050116 - 10,50
5 - 2 - 20050501 - 1,40
6 - 2 - 20050604 - 1,45
7 - 3 - 20050116 - 10,65
8 - 1 - 20050420 - 20,90

Et j'ai besoin de retrouver une ligne par article correspondant à la dernière vnte de celui-ci

Soit :

1 - 20050420 - 20,90
2 - 20050604 - 1,45
3 - 20050116 - 10,65

Lorsque je fais ma requête, j'utilise la selection sur le MAX de mon movedate et un GROUP BY sur le id_stock

Le problème c'est que le id_histo et price ne sont pas retournés à cause du GROUP BY.

Une solution ?

Merci d'avance

Fred

essaies d'intégrer tes colonnes dans le group by
group by movedate, id_histo, price

--
Jacques Trepp
Albygest - 81160 - St Juery
jacques-pas de spam.trepp@free.fr
(enlever '-pas de spam' pour me joindre)
http://www.albygest.com
Posté le 04 novembre 2005 - 11:50
Bonjour,
Une ideé.
SI au lieu de faire une sous requete, tu faisais une requête, avec tes deux fichiers, en utilisant un left join et en testant l'absence des enregistements coté Carte?
Ciao
Posté le 04 novembre 2005 - 14:08
Merci à toi Antoine pour la démarche....malheureusement cette requête ne me renvoit pas ce dont j'ai besoin....

Ceci dit, je pense que c'est la voix à suivre, mais une subtilité doit m'échapper. J'ai essayé plusiurs manière avec ce deuxième SELECT mais rien n'y fait !

Si quelqu'un à d'autres idées ?

Merci

Fred
Posté le 10 novembre 2005 - 14:54
Si je peux me permettre :

SELECT Stock.id_Stock, Histo.movedate, Histo.Price
FROM Stock
LEFT OUTER Historique Histo ON Histo.id_stock = Stock.id_stock
WHERE
Histo.movedate = ( SELECT Max(Histo2.movedate) FROM Historique Histo2
WHERE Histo2.id_stock = Stock.id_stock)