[Résolu en 1h30 !][SQL] requête , sous-requêtes

requête , sous-requêtes [Résolu en 1h30 !][SQL] - SQL/NoSQL - Programmation

Marsh Posté le 23-01-2007 à 12:34:53    

Bonjour, j'ai un petit soucis avec une requete sur une table. J'utilise SQLite dans un programme C.
 
ma table comporte 3 champs : id StartTime EndTime.
StartTime et EndTime sont des dates/heures au format 2007-01-10T16:00:00Z
la table contient des valeurs sur une semaine, pour un endtime j'ai un start pour chaque id (sauf les bornes).
 
j'ai donc des entrées du type :  
 
1;2007-01-10T16:00:00Z;2007-01-10T16:30:00Z
1;2007-01-10T16:30:00Z;2007-01-10T16:32:00Z
1;2007-01-10T16:32:00Z;2007-01-10T16:41:00Z
..
et bien sur idem avec d'autres id.
 
 
la requête pour avoir les événements courrants ( au 2007-01-10T16:00:00Z par exemple) est simplement :  
 
SELECT id,StartTime,EndTime
FROM matable
WHERE StartTime >= '2007-01-10T16:00:00Z' AND EndTime < '2007-01-10T16:00:00Z'
 
je voudrais maintenant faire une requête sur les événements suivants ceux en cours.
il faut que je fasse une requête en prenant pour Start le End avec le même ID
 
je pensais utiliser
 
SELECT id,StartTime,EndTime
FROM matable
WHERE (id,StartTime) MATCH (SELECT id,EndTime
       FROM matable
       WHERE StartTime >= '2007-01-10T16:00:00Z' AND EndTime < '2007-01-10T16:00:00Z')
 
mais SQLite n'a pas l'air de supporter les doublons pour un match
 
 
utilisant SQLite dans un programme en C je peux toujours faire la requete NOW recupérer les resultats et faire autant de requetes que de resultat avec
SELECT id,StartTime,EndTime
FROM matable
WHERE id = id_recupere
 AND StartTime = EndTime_recupere
 
mais si SQLite peut me faire ça en 1 requete, cette solution serait plutot moche et moins performante.


Message édité par Daimakaicho le 23-01-2007 à 14:33:22
Reply

Marsh Posté le 23-01-2007 à 12:34:53   

Reply

Marsh Posté le 23-01-2007 à 14:00:06    

Déjà, soit c'est une Date (donc pas de format) soir c'est un Varchar (et donc pas une date).
Faut choisir :o
 
Ceci dit je sais pas ce que tu va chercher avec MATCH (c'est quoi ce truc proprio encore ?) :
 

SELECT m2.id, m2.StartTime, m2.EndTime  
FROM matable m1 inner join matable m2 on m2.id = m1.id and m2.StartTime = m1.EndTime
WHERE m1.StartTime >= '2007-01-10T16:00:00Z' AND m1.EndTime < '2007-01-10T16:00:00Z'


 
Ca devrait marcher non ?
 
-- correction de la requête (chelou qu'elle marchait avant [:magicbuzz] )


Message édité par MagicBuzz le 23-01-2007 à 15:17:56
Reply

Marsh Posté le 23-01-2007 à 14:01:47    

PS : Et au lieu d'écrire la date courante comme un goret dans la requête, utilise la fonction de SQLLite qui permet de trouver la date courante. Genre "sysdate", "GetDate()", "Now()", etc.


Message édité par MagicBuzz le 23-01-2007 à 14:02:02
Reply

Marsh Posté le 23-01-2007 à 14:32:34    

merci beaucoup ça marche impeccable et en plus c'est très simple.  Mon SQL est (beaucoup) rouillé, ça date un peu la dernière fois que j'en ai utilisé et ce n'était pas très poussé.
 
re merci beaucoup !
 
ps : match n'est pas proprio  
ps2 : pour mon test ce sont des données passées donc c'est pour ça que j'ai mis la date en dure j'utiliserai effectivement quelque chose dans le genre si c'est supporté par SQLite.
ps3 : SQLite gère uniquement des types NULL INTEGER REAL TEXT BLOB. sans longeur fixe ou max pour les chaines de caracteres.

Reply

Marsh Posté le 23-01-2007 à 15:07:16    

Tu peux caster un Date en REAL ou en INTEGER, selon si tu utilises le système Unix (INTEGER = nb millisecondes depuis 1/1/19** 00:00:00) ou Windows (ou OA pour OLE Automate) (REAL = partie entière = nb jours depuis 30/12/1999 / partie décimale = fraction de la journée [.5 = midi])
A défaut, utilise le format ISO-chais-plus-combien : YYYY-MM-DD h24:mi:ss (ou format compressé : YYYYMMDDh24miss) qui est triable, se stock aussi bien dans un text qu'un integer, et qui est facile à lire.
 


Une date OLE Automation est implémentée en tant que nombre à virgule flottante dont la valeur correspond au nombre de jours écoulés à compter du 30 décembre 1899 à minuit. Par exemple, le 31 décembre 1899, minuit, est représenté par 1.0 ; le 1er janvier 1900, 6 A.M., est représenté par 2.25 ; le 29 décembre 1899, minuit, est représenté par -1.0 et le 29 décembre 1899, 6 A.M., est représenté par -1.25.
 
La date OLE Automation de base est le 30 décembre 1899, minuit. La date OLE Automation maximale est la même que MaxValue, soit le dernier instant du 31 décembre 9999.
 
Pour plus d'informations sur OLE Automation, consultez la MSDN Library.


 
** : chais plus combien ? 1970 ? chais plus :D
 
MATCH, tu l'as vu avec quel SGBD ?
Je connais bien une instruction MATCH (non normalisée) mais qui ne s'utilise pas du tout pour faire ce que tu voulais faire. Ca sert habituellement à faire des recherche dans des index de texte intégral.


Message édité par MagicBuzz le 23-01-2007 à 15:26:38
Reply

Marsh Posté le 23-01-2007 à 15:31:04    

Pour la date je n'ai pas vraiment le choix du format  c'est une donnée que je me reçois qui arrive de cette façon ce qui ne me gene pas vu qu'on peut comparer avec les outils ad'hoc pour les chaines.
 
MATCH je l'ai vu en regardant http://sql.developpez.com/sqlaz/sousrequetes/ mais comme on peut le voir en bas de la page ce n'est quasiment pas supporté. le site ne précise pas si c'est un élement de la norme mais tel que c'est présenté je le suppose.
 
C'est bien de cette instruction dont je parle, comme de toute façon tout ou presque (dès que ce n'est pas un nombre) est du TEXTE dans SQLite donc ...
 

Citation :

(chelou qu'elle marchait avant [:magicbuzz] )


 
je n'avais pas fait un copié collé brutal mais réécrit  :sol:    ce n'est pas exactement les noms des champs que j'utilise et que j'ai mis ici. Voila le pourquoi du comment.


Message édité par Daimakaicho le 23-01-2007 à 15:34:31
Reply

Marsh Posté le 23-01-2007 à 15:46:14    

pour le match, c'est donc pas le truc habituel (super, encore un homonyme, comme s'il n'y en avait pas assez...)
 
on dirait que c'est une tambouille de MySQL (ils ont pas mal de trucs dans ce genre). Certainement supporté par PostGre, et Oracle doit proposer un équivalent hors norme. A priori, le match donc tu parles pourrait faire l'objet d'une version de SQL récente (20xx). Vu que la plupart des SGBD ont encore du mal avec SQL92 (pourtant la première version de la norme) on va peut-être pas s'enflammer tout de suite hein ? ;)
 
Sinon, tu trouveras régulièrement MATCH (sur la plupart des SGBD) mais dans un autre sens :
 
http://dev.mysql.com/doc/refman/5. [...] earch.html
 
Ca permet de faire des recherche "naturelles" dans une table. C'est utilisé de pair avec CONTAINS et FREETEXT généralement.

Reply

Marsh Posté le 23-01-2007 à 16:13:30    

On devait parler de la meme chose :  le FullText Search   mais la syntaxe est juste différente.
 
La version présenté dans developpez.com est normallement la norme, (leur image sql2 qui le montre, si il respecte l'intro héhé)
ce qui correspond effectivement à la norme ( http://www.contrib.andrew.cmu.edu/ [...] ql1992.txt  point 8.10 )  
et SQLite qui utilise une syntaxe très proche http://www.sqlite.org/cvstrac/wiki?p=FullTextIndex mais qui est de tout façon très limité.
 
comme tu le dis c'est MySQL qui a implémenté ça à leur sauce.


Message édité par Daimakaicho le 23-01-2007 à 16:25:11
Reply

Marsh Posté le 23-01-2007 à 16:19:41    

le truc SQL2 n'a rien à voir avec FullText Search... Il s'agit de traîter des lignes en tant que tuples. MATCH sert ici à tester l'égalité entre deux tuples (c'est dire deux lignes identiques).
 
Avec FullText Search, MATCH (qui travaille avec AGAINST) sert à trouver l'orrurence d'une série de mots clés dans un champ, et retourner une valeur de pertinance. Rien à voir :)
 
Dans tous les cas, oublie le MATCH de ton exemple, très peu de SGBD le supportent ;)


Message édité par MagicBuzz le 23-01-2007 à 16:22:10
Reply

Marsh Posté le 23-01-2007 à 17:09:43    

OOps au passage dans ce que j'ai posté j'ai mis un  Start >= NOW et NOW > End     c'est bien sur Start <= NOW and NOW < END
dans ce que je testais c'était dans le bon ordre ^^


Message édité par Daimakaicho le 23-01-2007 à 17:10:16
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed