Forum du clan Vioc

Clan [Vioc] - Geriatric Gaming Club since A.D. MMIII - [Vioc] Parkinson nous fait cliquer plus vite, Alzheimer nous fait oublier le résultat.
It is currently 25 Jun 2025 22:45

All times are UTC + 1 hour [ DST ]




Post new topic Reply to topic  [ 8 posts ] 
Author Message
 Post subject: Pro du SQL ?
PostPosted: 23 Feb 2013 11:32 
Offline
Floodeur schizophrene
User avatar

Joined: 21 Oct 2004 23:08
Posts: 1566
Ce message est destiné a JF, mais s'il y a d'autre Pro du SQL , je suis preneur.
Si vous comprenez rien, c'est normal, passez juste votre chemin :D

Une double question sur une requete que je ne sais ecrire:

voila la base :

SELECT ROW_NUMBER() OVER(ORDER BY RaceTime ASC) AS Row, ID_Ghost, RaceTime FROM Ghost WHERE Class=? AND MirrorMode=? AND CircuitID=? ORDER BY RaceTime ASC, Date_Enregistrement ASC;

Ce truc fonctionne et retourne:
Quote:
Row=1 | ID_Ghost=22 | RaceTime=35599 |
Row=2 | ID_Ghost=21 | RaceTime=35767 |
Row=3 | ID_Ghost=2 | RaceTime=36666 |
Row=4 | ID_Ghost=4 | RaceTime=37067 |
Row=5 | ID_Ghost=10 | RaceTime=37833 |
Row=6 | ID_Ghost=8 | RaceTime=38100 |


voila mes 2 questions :

-quel Syntaxe utiliser pour que la requete me retourne une seul ligne avec un critere fournit, disons le ID_Ghost=2, mais le Row_Number qui correspond bien à la position de la requete initial ?
donc je veux juste
Quote:
Row=3 | ID_Ghost=2 | RaceTime=36666 |

sans avoir a parcourir par script tout les enregistrements pour trouver le bon. Pour info : j'utilise un objet RecordeSet adoDB pour parcourir les enregistrements.


-2em question :
le WHERE ==> WHERE Class=? AND MirrorMode=? AND CircuitID=?
Les variables sont obtenues via une premiere requete dans cette meme table
Quote:
SELECT Class, MirrorMode, CircuitID, RaceTime FROM Ghost WHERE ID_Ghost=?

Je stock mes variables Class, MirrorMode et CircuitID ... et je fais une 2em requete ( celle de base )

Il y aurai un moyen de faire tout d'un coup un truc du genre
Quote:
SELECT ROW_NUMBER() OVER(ORDER BY RaceTime ASC) AS Row, ID_Ghost, RaceTime FROM Ghost WHERE (Class, MirrorMode, CircuitID) IN (SELECT Class, MirrorMode, CircuitID FROM Ghost WHERE ID_Ghost=?)

Mais visblement sous SQL Express 2012 , ça ne marche pas, et j'ai lu que MSSQL surpportait pas forcément cette instruction ( WHERE (Class, MirrorMode, CircuitID) IN ) , mais l'info date de 2007
C'est moins obligatoire, mais ça serait plus classe, que tout soit fait d'une seule requete.

Alors si vous voyez une solution qui vous semble simple, moi je seche un peu sur ce coup.
Le truc du Row_Number je connaissais pas avant hiers :D

Si vous avez compris de quoi on parle, et que vous avez une solution, faire vous plaisir.
l'idée c'est qu'a la fin il y ai qu'une seule requete.
la 2em partie peut rester en 2 requetes, l'execution etant extrement rapide.
la 1er partie est plus importante, parcourir le jeu de resultat pour trouver la bonne ligne risque de poser probleme de performance si j'ai 50 000 enregistrements dans la table.

_________________
Pas de bras ! Pas de chocolat !


Top
 Profile  
 
 Post subject: Re: Pro du SQL ?
PostPosted: 23 Feb 2013 12:46 
Offline
oo
User avatar

Joined: 11 Oct 2003 8:42
Posts: 8652
Location: Idéalement? Dans mon lit!
Je ne connais que le SQL d'Oracle.

Code:
(...) FROM Ghost WHERE (Class, MirrorMode, CircuitID) IN (SELECT Class, MirrorMode, CircuitID FROM Ghost WHERE ID_Ghost=?)


Ca s'est parfaitement valide.

Mais ce sera plus performant si tu fait comme ça (en gros si t'as beaucoup de lignes) :
Code:
(...) FROM Ghost A WHERE (A.Class, A.MirrorMode, A.CircuitID) IN (SELECT B.Class, B.MirrorMode, B.CircuitID FROM Ghost B WHERE B.ID_Ghost=? AND  A.Class = B.Class AND  A.MirrorMode = B.MirrorMode AND A.CircuitID = A.CircuitID)

_________________
Image


Top
 Profile E-mail  
 
 Post subject: Re: Pro du SQL ?
PostPosted: 23 Feb 2013 13:09 
Offline
Floodeur schizophrene
User avatar

Joined: 21 Oct 2004 23:08
Posts: 1566
c'est pour la question 2:
ton exemple fonctionne SOUS MSSQL avec un critère unique
Code:
'SELECT ga.* FROM Ghost as ga WHERE (ga.CircuitID) IN (SELECT gb.CircuitID FROM Ghost as gb WHERE ID_Ghost=? AND ga.CircuitID=gb.CircuitID ) ';

ça marche.

Mais dès que je rajoute une virgule
Code:
'SELECT ga.* FROM Ghost as ga WHERE (ga.Class, ga.CircuitID) IN (SELECT gb.CircuitID FROM Ghost as gb WHERE ID_Ghost=? AND ga.Class=gb.Class AND ga.CircuitID=gb.CircuitID ) ';

j'ai un beau :
Microsoft][SQL Server Native Client 11.0][SQL Server]Expression de type non booléen spécifiée dans un contexte où une condition est attendue, près de ','.

culé d'SQL Server de Crosoft :)
viblement je dois plutot utiliser la clause EXISTS qui marche avec MSSQL.

c'est surtout la question 1 qui me bloque aussi :) tu as pas une idée la dessus ?

_________________
Pas de bras ! Pas de chocolat !


Top
 Profile  
 
 Post subject: Re: Pro du SQL ?
PostPosted: 23 Feb 2013 15:18 
Offline
oo
User avatar

Joined: 11 Oct 2003 8:42
Posts: 8652
Location: Idéalement? Dans mon lit!
Code:
'SELECT ga.* FROM Ghost as ga WHERE (ga.Class, ga.CircuitID) IN (SELECT gb.CircuitID, gb.CircuitID FROM Ghost as gb WHERE ID_Ghost=? AND ga.Class=gb.Class AND ga.CircuitID=gb.CircuitID ) ';


T'as oubié le ", gb.CircuitID" au début de la sous-requête, j'imagine que c'est juste une typo.

Le SQL c'est censé être assez standard et l'utilisation du IN de cette manière c'est pas quelque chose de très très exotique, il y a pas de raison que ça ne fonctionne pas... mais bon encore une fois je ne bosse que sur Oracle.

_________________
Image


Top
 Profile E-mail  
 
 Post subject: Re: Pro du SQL ?
PostPosted: 23 Feb 2013 16:24 
Offline
oo
User avatar

Joined: 11 Oct 2003 8:42
Posts: 8652
Location: Idéalement? Dans mon lit!
Tu peux essayer la concaténation :

Code:
'SELECT ga.* FROM Ghost as ga WHERE ga.Class || ga.CircuitID) IN (SELECT gb.CircuitID || gb.CircuitID FROM Ghost as gb WHERE ID_Ghost=? AND ga.Class=gb.Class AND ga.CircuitID=gb.CircuitID ) ';


C'est du bricolage mais ça peut marcher.

_________________
Image


Top
 Profile E-mail  
 
 Post subject: Re: Pro du SQL ?
PostPosted: 24 Feb 2013 1:45 
Offline
Magnum
User avatar

Joined: 09 Nov 2008 22:53
Posts: 197
Pour la premiere question, tu es obligé de faire une requête qui entoure ta requête, genre

Select * from ( select ...) where row = ?

Pour la seconde question, pareil que Karim, sur oracle ça marche, éventuellement tu peux mettre ton select sur la table ghost dans le from, ainsi tu peux faire de simples jointures dessus pour le même résultat que ce que tu cherches.


Top
 Profile E-mail  
 
 Post subject: Re: Pro du SQL ?
PostPosted: 24 Feb 2013 1:51 
Offline
Magnum
User avatar

Joined: 09 Nov 2008 22:53
Posts: 197
Question bête, sous oracle il existe "ROWNUM" qui fait a prioris la même chose que ta fonction analytique même si je suis pas sur à 100%. Est ce que ça marche chez toi, ça rendrait le problème plus simple.


Top
 Profile E-mail  
 
 Post subject: Re: Pro du SQL ?
PostPosted: 24 Feb 2013 10:18 
Offline
Floodeur schizophrene
User avatar

Joined: 10 Mar 2007 15:02
Posts: 4507
Location: au pays des winners
Pareil que newith, j'aurai fait un select sur un autre select mais de là à te réécrire la requête, j'ai tout oublié depuis. Sinon, suivant le langage que tu as derrière, je trie sur une valeur dans le résultat du select, à base de xpath, ou linq ou dataset directement dans ton soft

_________________
Everything is clearer now. Life is just a dream you know.
That's never ending, I'm ascending


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 8 posts ] 

All times are UTC + 1 hour [ DST ]


Who is online

Users browsing this forum: No registered users and 2 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group