IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Contourner l'absence de Connect by level


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2009
    Messages : 6
    Points : 7
    Points
    7
    Par défaut Contourner l'absence de Connect by level
    Bonjour,

    Je suis en train de me former à WAMP (Windows, Appache, MySql et PHP). Comme il n'existe pas sous MySql d'instruction Connect by level, je vous propose une astuce pour générer dynamiquement un calendrier de 1.000.000 de lignes sans utiliser cette fonction.

    La vue VCAL de mes tests pourra être remplacée par une vue matérialisée ou par une table si l'on souhaite améliorer les temps de réponse.

    Bon tests

    Se passer de CONNECT BY LEVEL.sql

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    En quoi ton script en pur dialecte Oracle a-t-il sa place sur le forum MySQL ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2009
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    J'utilise depuis 3 ans maintenant sous Oracle le Connect by level pour gérer le calendrier tel que défini dans la pièce jointe. Je débute depuis 1 semaine sur WAMP mais pas encore sur MySql.

    J'ai découvert en lisant des forums que le connect by level ne fonctionne pas sous MySql. J'ai donc modifié mon script d'origine sous Oracle afin de créer un calendrier final facilement exploitable en développement, à l'instar de ce que je faisais sous Oracle, en me passant du connect by level.

    Je n'ai pas encore testé ce script sous MySql mais il ne contient que des instructions SQL de base donc devrait être facilement portable.

    Je déposerai une version de ce script sous MySql sans doute la semaine prochaine, je vais avoir besoin de ce calendrier rapidement.

    Philippe

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2009
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    Suite à la pertinente remarque du modérateur, voici le script MYSQL que j'ai développé pour contourner l'absence de CONNECT BY LEVEL :

    Tout d'abord, voici la requête ORACLE que j'utilisais afin de générer dynamiquement un calendrier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    -- ============================================================================
    -- Génération dynamique d'un calendrier de 999999 jours à partir du 01.01.1900
    -- ============================================================================ 
    SELECT 	TO_DATE('19000101','YYYY.MM.DD')-1+A.SEQ DAT
    		,TO_CHAR(TO_DATE('19000101','YYYY.MM.DD')-1+A.SEQ,'DD') JOUR
    		,TO_CHAR(TO_DATE('19000101','YYYY.MM.DD')-1+A.SEQ,'MM') MOIS
    		,TO_CHAR(TO_DATE('19000101','YYYY.MM.DD')-1+A.SEQ,'YYYY') ANNEE
    		,TO_CHAR(TO_DATE('19000101','YYYY.MM.DD')-1+A.SEQ,'MM.YYYY') MOISANNEE
    														 FROM DUAL,(SELECT 	 LEVEL SEQ
    																   FROM 	 DUAL
    																   CONNECT BY LEVEL <= 999999) A
    Dans cette fonction la sous requête ... CONNECT BY LEVEL ... restitue une variable SEQ valorisée de 1 à 999999

    Le CONNECT BY LEVEL n'ayant pas d'équivalent sous MYSQL, j'ai trouvé cette solution pour arriver au même résultat sous MySQL :

    1-Création d'une table de travail T1 d'une seule colonne SEQ valorisée de 0 à 9 :

    -- Structure de la table `t1`

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    CREATE TABLE `t1` (
      `SEQ` tinyint(4) NOT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
     
    --
    -- Index pour la table `t1`
    --
    ALTER TABLE `t1`
      ADD PRIMARY KEY (`SEQ`);
     
    --
    -- Contenu de la table `t1`
    --
     
    INSERT INTO `t1` (`SEQ`) VALUES
    (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
    2- Création d'une vue V1 définie comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    --
    -- Structure de la vue `v1`
    --
    DROP TABLE IF EXISTS `v1`;
     
    CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1`  	AS  select cast(concat(`a`.`SEQ`,`b`.`SEQ`,`c`.`SEQ`,`d`.`SEQ`,`e`.`SEQ`,`f`.`SEQ`) as unsigned) AS `seq` from (((((`t1` `a` join `t1` `b`) join `t1` `c`) join `t1` `d`) join `t1` `e`) join `t1` `f`) where (cast(concat(`a`.`SEQ`,`b`.`SEQ`,`c`.`SEQ`,`d`.`SEQ`,`e`.`SEQ`,`f`.`SEQ`) as unsigned) <> 0) order by cast(concat(`a`.`SEQ`,`b`.`SEQ`,`c`.`SEQ`,`d`.`SEQ`,`e`.`SEQ`,`f`.`SEQ`) as unsigned) ;
    3- Exploitation de V1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    -- ============================================================================
    -- Génération dynamique d'un calendrier de 999999 jours à partir du 01.01.1900
    -- ============================================================================
    SELECT 		adddate(STR_TO_DATE ( '01/01/1900' , '%d/%m/%Y'), - 1 + a.seq)  DAT 
    		,	day(adddate(STR_TO_DATE ( '01/01/1900' , '%d/%m/%Y'), - 1 + a.seq)) JOUR
    		,	month(adddate(STR_TO_DATE ( '01/01/1900' , '%d/%m/%Y'), - 1 + a.seq)) MOIS
    		,	year(adddate(STR_TO_DATE ( '01/01/1900' , '%d/%m/%Y'), - 1 + a.seq)) ANNEE 
    		,	concat(lpad(month(adddate(STR_TO_DATE ( '01/01/1900' , '%d/%m/%Y'), - 1 + a.seq)),2,'0'),'.',
                    	lpad(year(adddate(STR_TO_DATE ( '01/01/1900' , '%d/%m/%Y'), - 1 + a.seq)),4,'0')) MOISANNEE
    FROM  	V1 A
    ;
    La vue V1 est issue d'une jointure de 6 fois la table T1 (pour 999999 lignes) mais peut être adaptée afin de ramener plus ou moins de lignes.

    De cette vue V1 j'alimente ensuite une table CALENDRIER dans laquelle je recense tous les jours fériés, les jours ouvrés, et les week-end.

    Cordialement

    Philippe

Discussions similaires

  1. Contournement absence de SQL Agent sous express
    Par Nadinette dans le forum Administration
    Réponses: 3
    Dernier message: 18/12/2012, 17h29
  2. Utilisation du connect by level
    Par Linda_01 dans le forum SQL
    Réponses: 5
    Dernier message: 22/11/2012, 12h05
  3. [AC-2007] "connect by level" et "dual"
    Par alx13 dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 08/11/2010, 15h28
  4. Contourner l'absence de paramètre out
    Par stof dans le forum Général Java
    Réponses: 5
    Dernier message: 08/03/2010, 16h29
  5. comment contourner l'absence de tableau croisé
    Par lotfilol dans le forum BIRT
    Réponses: 2
    Dernier message: 12/07/2007, 15h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo