Pages

Affichage des articles dont le libellé est requêtes. Afficher tous les articles
Affichage des articles dont le libellé est requêtes. Afficher tous les articles

[XL-2010] Base Oracle et requêtes SQL sous VBA sujet

mardi 8 avril 2014




Bonjour tout le monde,

Je poste ce message dans l'espoir que quelqu'un puisse m'éclairer.

J'explique ma situation. Je dispose d'une base Oracle. J'ai importée une table de cette base sous Excel pour pouvoir y appliquer des requêtes. Seulement peut-on exécuter des ordres SQL en VBA si la table est affichée sous forme de tableau dans Excel et n'est donc pas dans une base de données ?

De plus, lors de mon importation de la base via Excel/Données externes, le bouton : "Ne rien importer et ne créer que la connexion" était grisé. Cela veut-il dire que je vais devoir importer toutes mes tables une à une sur plusieurs onglets ??

En fait, j'ai besoin d'exécuter des requêtes SQL sur cette base et de mettre les résultats sous des tableaux Excel afin d'en faire des graphiques. Est-ce possible ? Si oui, comment ?

Je connais le langage SQL mais je débute en VBA, et je ne m'en sors pas ! C'est pourquoi je vous remercie de vos réponses.

Crysta




[9.2] Optimisation de requêtes avec une partie "plein texte" sujet

vendredi 31 janvier 2014




Je vais tenter avec un exemple minimaliste


Code:


CREATE TABLE Main (
        k1 int,
        k2 bigint,
        datage timestamp,
        champ1 text,
        ts_champ1 tsvector, -- ts_champ1=to_tsvector('english',champ1)
        champ2 text,
        PRIMARY KEY(k1, k2)
);
CREATE INDEX main_datage_idx ON Main USING btree(datage);
CREATE INDEX main_champ1_idx ON Main USING gin(ts_champ1) WITH ( fastupdate=on );

EXPLAIN ANALYZE
SELECT k2 FROM Main WHERE
        k1=1 AND champ1 ~* 'm1.*m2.*m3' AND champ2 ~* 'm4';
----------------------------------------------------------------------------------
Index Scan using main_pkey on main  (cost=0.00..8681.10 rows=1 width=8) (actual time=25.779..111.146 rows=32 loops=1)
  Index Cond: (k1 = 1)
  Filter: (((champ1)::text ~* 'm1.*m2.*m3'::text) AND (champ2 ~* 'm4'::text))
  Rows Removed by Filter: 4921
Total runtime: 111.255 ms

EXPLAIN ANALYZE
SELECT k2 FROM Main WHERE
        k1=1 AND ts_champ1 @@ to_tsquery('english','m1 & m2 & m3') AND champ2 ~* 'm4';
----------------------------------------------------------------------------------
Bitmap Heap Scan on main  (cost=894.12..950.09 rows=1 width=8) (actual time=424.047..426.501 rows=32 loops=1)
  Recheck Cond: ((k1 = 1) AND (ts_champ1 @@ '''m1'' & ''m2'' & ''m3'''::tsquery))
  Rows Removed by Index Recheck: 1169
  Filter: (contenu ~* 'm4'::text)
  Rows Removed by Filter: 120
  ->  BitmapAnd  (cost=894.12..894.12 rows=14 width=0) (actual time=423.993..423.993 rows=0 loops=1)
        ->  Bitmap Index Scan on main_pkey  (cost=0.00..201.02 rows=8352 width=0) (actual time=0.589..0.589 rows=4953 loops=1)
              Index Cond: (k1 = 1)
        ->  Bitmap Index Scan on main_champ1_idx  (cost=0.00..692.85 rows=6514 width=0) (actual time=423.281..423.281 rows=122056 loops=1)
        Index Cond: (ts_champ1 @@ '''m1'' & ''m2'' & ''m3'''::tsquery)
Total runtime: 426.600 ms




Mon but final est de faire, de manière très performante sur une table pour un filtre via k1 me renverra environ 8M lignes, une requête qui naïvement serait de ce type :

Code:


SELECT k2 FROM Main WHERE
        k1=? AND champ1 ~* 'm1.*m2.*m3' AND champ2 ~* 'm4'
        AND datage>=?



  • Évidemment m1,m2,m3 et m4 pourraient évoluer selon le besoin fonctionnel. Le but est de capturer des contextes autour d'événement, selon le type d'événement, tout peut changer... j'ai réussi à modéliser tous les cas envisageables, issus d'un REX d'autres projets similaires, avec ces paramètres (m1,m2,m3 devenant plus une liste d'ailleurs).

  • Je m'oriente plus sur les tsvector/tsquery pour la requête finale a priori (impossible d'indexer selon des regexp en 9.2)

  • Le dernier point auquel je réfléchis serait d'intégrer également ces paramètres en base pour donner une "interface de personnalisation de requêtes haut-niveau" (sans SQL visible et a priori loin de la structure réelle de la base)



Auriez-vous des conseils ?


:merci:




Deux requêtes dans une sujet

jeudi 30 janvier 2014




Bonjour,

Je suis débutant en SQL et je chercherai un coups de pouce sur une requête particulière. J'ai du mal a expliquer mon problème simplement alors j'ai fait une image:



Et ma requête pour est :


Code:


SELECT        hot.name, hot.first_name, esta.establishment_id, esc.group_establishment, blish.label, esc.collectivite_id
FROM            imghotline.hotline_user AS hot INNER JOIN
                        imghotline.establishment_user AS esta ON hot.hotline_user_id = esta.hotline_user_id INNER JOIN
                        imghotline.establish AS esc ON esta.establishment_id = esc.establishment_id INNER JOIN
                        imghotline.establishment AS blish ON blish.establishment_id = esta.establishment_id
ORDER BY hot.name



Il faudrait que label (nom de poste) affiché ne soit pas celui de l'utilisateur en cours mais celui de sont groupe (en gros si il est développeur, sa affiche système informatique).
Il faudrait faire comme une deuxième requête dans ma requête mais je trouve pas comment faire. J'ai trouver des jointure right et left mais je sais pas si c'est tellement sa...

Auriez-vous une piste?












Images attachées





Type de fichier : png Sans titre.png (7,4 Ko)