Forum du clan Vioc
http://www.vioc.fr/forum/

Pro du SQL ?
http://www.vioc.fr/forum/viewtopic.php?f=12&t=16173
Page 1 sur 1

Auteur:  jem [ 23 Fév 2013 11:32 ]
Sujet du message:  Pro du SQL ?

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:
Citation:
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
Citation:
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
Citation:
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
Citation:
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.

Auteur:  Korbak [ 23 Fév 2013 12:46 ]
Sujet du message:  Re: Pro du SQL ?

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)

Auteur:  jem [ 23 Fév 2013 13:09 ]
Sujet du message:  Re: Pro du SQL ?

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 ?

Auteur:  Korbak [ 23 Fév 2013 15:18 ]
Sujet du message:  Re: Pro du SQL ?

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.

Auteur:  Korbak [ 23 Fév 2013 16:24 ]
Sujet du message:  Re: Pro du SQL ?

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.

Auteur:  newith [ 24 Fév 2013 1:45 ]
Sujet du message:  Re: Pro du SQL ?

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.

Auteur:  newith [ 24 Fév 2013 1:51 ]
Sujet du message:  Re: Pro du SQL ?

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.

Auteur:  Lancelion [ 24 Fév 2013 10:18 ]
Sujet du message:  Re: Pro du SQL ?

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

Page 1 sur 1 Heures au format UTC + 1 heure [ Heure d’été ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/