[OSM-dev-fr] requete sql

Philippe Verdy verdy_p at wanadoo.fr
Ven 12 Déc 22:54:37 UTC 2014


Le mot-cle WITH sert juste a nommer une sous-requête dont le résultat donne
une table temporaire utilisable dans une clause FROM d'une requête parente.
Dans d'autres moteurs on peut mette la sous requête directement dans la
clause FROM ou dans un JOIN (interne ou externe) simplement entre
parenthèse suivi éventuellement d'un nom d'Alias pour cette table
temporaire. Dans d'autres comme Sybase ou MSSQL on peut grouper toutes les
tables danscka clause FROM et faire le reste dans les clauses WHERE ou
GROUP BY avec une syntaxe etendue pour les jointures ouvertes. Et sous
Oracle et Informix il y a encore d'autres possibilités avec les requêtes
hiérarchiques. Enfin dans les principaux moteurs on a des procédures
stockées permettant d'utiliser des curseurs explicites (sous oracle, Sybase
mssql ca marchevtres bien et c'est performant. Un peu moins sous Informix
qui a des limitations parfois très chiantes si les tables incluent des
blobs car car leur utilisation via des curseurs casse les transactions
etvkacces aux blobs est difficile alors a lier aux tables temporaires decka
table maitre ce quinobluge a passer par des tables permanentes et faire du
nettoyage manuel et gérer ses propres verrous dans une table annexe.... Pas
très propre on doit avoir un bot régulier pour ralasser les miettes
utilisees temporairement sinon la base se remplit vite avec des donnees
temporaires de vieilles transactions.
Selon le moteur sous jascent les solutions exustent mais ca demande des
méthodes différentes. Mais on peut se passer de développer un client en C
ou PHP. Sous MySQL en revanche c'est très pauvre et le client reste
necessaire. Mais il existe certains clients specialisises pour les cubes
d'analyse statistique ou pour le reporting complexe tel que les applis
comptables et de facturation ou gestion de logistique et ressources avec
plein de regles métier qui changent sans arret duvfaitvdes lois ou de la
politique commerciale évolutive. J'utilise pas mal BO pour ca. Mais sous
Oracle je préfère faire du PL*SQL en procédures stockées ou de petites
classes java qu'on peut aussi stocker et décrire comme si c'était des vues
ou des tables et qu'on peut synchroniser avec les transactions même si
elles sont distribuées sur plusieurs serveurs avec un moniteur
transactionnel et du commit multiphase et meme des points de reprise
partiel pour éviter de tout abandonner et recommencer quand on requête une
base en live avec des accès concurrents imprevisibles donc sans mètre la
base offline pour le temps d'un batch compliqué
Le 11 déc. 2014 20:22, "Christian Quest" <cquest at openstreetmap.fr> a écrit :

> Ah ok, un WITH/SELECT/UPDATE doit permettre de faire ça.
>
> WITH u as (SELECT t1.id, t2.temps*1.5 as temps FROM latable t1 JOIN
> latable t2 ON (t2.id=t1.id-1) WHERE t1.temps IS NULL AND t2.temps IS NOT
> NULL)
> UPDATE latable FROM u SET temps=u.temps WHERE id=u.id;
>
> L'idée c'est que le SELECT sort la liste des updates à faire et le WITH
> les passe à l'UPDATE...
> Là, le SELECT devrait sortir l'id et la valeur calculée de temps.
>
> Plus de doc sur ce "WITH" magique ici:
> http://docs.postgresql.fr/9.3/queries-with.html
>
> Tu va voir c'est mortel comme truc car ça peut être récursif :)
>
>
> Le 11 décembre 2014 19:52, didier2020 <didier2020 at free.fr> a écrit :
>
>> Le jeudi 11 décembre 2014 à 18:37 +0100, sly (sylvain letuffe) a
>> écrit :
>> > On jeudi 11 décembre 2014, didier2020 wrote:
>> > > une troncon de route n'a pas de comptage/temps,
>> > > mettre a jour ce troncon en prenant comme modele les données du
>> troncon
>> > > en amont/précédent avec un coef d'ajustement lié aux caractéristiques
>> > > des 2 troncon.
>> >
>> > Et si tu est présenté avec 3 tronçons consécutifs (t1,t2,t3) dont tu
>> ignores
>> > le temps, tu fais quoi pour t2 ?
>> ce n'est pas ce que désire faire, ce serait plutot
>> t1 et t3 connu
>> analyse les données de t1 et t3, puis essayer de corriger t2
>> la requete n'etant la que pour ne pas creer des paliers de temps
>>
>> > Tu calculs t1 d'abord et tu repasses ton algo pour trouver t2 ?
>> > Et si tu as 30 tronçons consécutifs ? une.... boucle ?
>> > gestion des valeurs invalides ? vitesse max : -5 ou 0 ou 250 ?
>> > Y'a un moment où SQL ne suffit plus, ma philosophie de
>> développement+sgbd :
>> > Dès que je suis tenté de mettre un if, c'est qu'il ne faut plus faire
>> ça en
>> > SQL ;-)
>>
>>
>>
>>
>>
>>
>>
>> _______________________________________________
>> dev-fr mailing list
>> dev-fr at openstreetmap.org
>> https://lists.openstreetmap.org/listinfo/dev-fr
>>
>
>
>
> --
> Christian Quest - OpenStreetMap France
>
> _______________________________________________
> dev-fr mailing list
> dev-fr at openstreetmap.org
> https://lists.openstreetmap.org/listinfo/dev-fr
>
>
-------------- section suivante --------------
Une pièce jointe HTML a été nettoyée...
URL: <http://lists.openstreetmap.org/pipermail/dev-fr/attachments/20141212/0d628ffc/attachment.html>


Plus d'informations sur la liste de diffusion dev-fr