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.
Nous sommes le 24 Avr 2024 12:58

Heures au format UTC + 1 heure [ Heure d’été ]




Poster un nouveau sujet Répondre au sujet  [ 8 messages ] 
Auteur Message
 Sujet du message: Pro du SQL ?
MessagePosté: 23 Fév 2013 11:32 
Hors ligne
Floodeur schizophrene
Avatar de l’utilisateur

Inscription: 21 Oct 2004 23:08
Messages: 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:
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.

_________________
Pas de bras ! Pas de chocolat !


Haut
 Profil  
 
 Sujet du message: Re: Pro du SQL ?
MessagePosté: 23 Fév 2013 12:46 
Hors ligne
oo
Avatar de l’utilisateur

Inscription: 11 Oct 2003 8:42
Messages: 8651
Localisation: 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


Haut
 Profil Envoyer un e-mail  
 
 Sujet du message: Re: Pro du SQL ?
MessagePosté: 23 Fév 2013 13:09 
Hors ligne
Floodeur schizophrene
Avatar de l’utilisateur

Inscription: 21 Oct 2004 23:08
Messages: 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 !


Haut
 Profil  
 
 Sujet du message: Re: Pro du SQL ?
MessagePosté: 23 Fév 2013 15:18 
Hors ligne
oo
Avatar de l’utilisateur

Inscription: 11 Oct 2003 8:42
Messages: 8651
Localisation: 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


Haut
 Profil Envoyer un e-mail  
 
 Sujet du message: Re: Pro du SQL ?
MessagePosté: 23 Fév 2013 16:24 
Hors ligne
oo
Avatar de l’utilisateur

Inscription: 11 Oct 2003 8:42
Messages: 8651
Localisation: 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


Haut
 Profil Envoyer un e-mail  
 
 Sujet du message: Re: Pro du SQL ?
MessagePosté: 24 Fév 2013 1:45 
Hors ligne
Magnum
Avatar de l’utilisateur

Inscription: 09 Nov 2008 22:53
Messages: 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.


Haut
 Profil Envoyer un e-mail  
 
 Sujet du message: Re: Pro du SQL ?
MessagePosté: 24 Fév 2013 1:51 
Hors ligne
Magnum
Avatar de l’utilisateur

Inscription: 09 Nov 2008 22:53
Messages: 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.


Haut
 Profil Envoyer un e-mail  
 
 Sujet du message: Re: Pro du SQL ?
MessagePosté: 24 Fév 2013 10:18 
Hors ligne
Floodeur schizophrene
Avatar de l’utilisateur

Inscription: 10 Mar 2007 15:02
Messages: 4507
Localisation: 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


Haut
 Profil  
 
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 8 messages ] 

Heures au format UTC + 1 heure [ Heure d’été ]


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 3 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages
Vous ne pouvez pas joindre des fichiers

Rechercher:
Aller à:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traduction par: phpBB-fr.com