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

MS SQL Server Discussion :

Requete SQL sql server


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 19
    Par défaut Requete SQL sql server
    Bonjour,
    Quelqu'un peut il m'aider?
    J'ai 2 tables:
    -Table Tickets: DATE_ACHAT DATETIME
    ID_VOL VARCHAR(7)
    -Table Vols: DATE_VOL DATETIME
    ID_VOL VARCHAR(7)
    ID_AEP VARCHAR(3)

    Table Tickets: DATE_ACHAT ID_VOL
    2010-05-01 11:00:00 AF447
    2010-05-01 11:35:00 AF445

    Table Vols: DATE_VOL ID_VOL ID_AEP
    2010-05-01 11:50:00 AF447 BKK
    2010-05-02 12:35:00 AF447 RST
    2010-05-03 13:32:00 AF447 KBL
    2010-05-01 12:50:00 AF445 MRC
    2010-05-02 13:35:00 AF445 NCE
    2010-05-03 14:32:00 AF445 OSL

    Je voudrais récupérer le ID_AEP pour chaque ligne ticket pour ID_VOL(ticket)=ID_VOL(vol) et DATE_ACHAT<DATE_VOL(la date la + proche)
    Pour la 1ere ligne ticket, je dois récupérer ID_AEP=BKK

    Merci.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Qu'avez-vous essayé ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 19
    Par défaut requete sql sql server
    Je suis passé par une procédure transact sql mais j'ai + de 3 000 000 lignes tickets donc trop long. Je voulais savoir si existe une méthode plus rapide en requete sql

  4. #4
    Membre chevronné Avatar de dream_rachid
    Homme Profil pro
    DBA & Responsable BI
    Inscrit en
    Mars 2006
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Tunisie

    Informations professionnelles :
    Activité : DBA & Responsable BI
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2006
    Messages : 278
    Par défaut
    Tu pourras utiliser une requête imbriquée genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Select T.*  ,
    ISNULL( SELECT TOP 1 ID_AEP FROM VOL AS V 
                    WHERE "CONDITION DE JOINTURE "
                     AND T.DATE < V.DAT ORDER BY V.DAT DESC)
     from TICKET T
    Concernant la performance de la requête 3 000 000 de lignes c'est pas trop pour un serveur SQL essaye de réviser les indexes de tes tables.

    J'espère que ça pourra te donner une piste pour résoudre ton problème.

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 998
    Billets dans le blog
    6
    Par défaut
    Faites une vue indexée calculant les MAX de date par ID_VOL puis utilisez cette vue indexée dans la requête.

    Si vous voulez plus d'aide, merci de respecter la charte de postage en postant le DDL et les script INSERT comme indiqué : http://www.developpez.net/forums/d96...vement-poster/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Avec une fonction de fenêtrage :
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    declare @Tickets table
    (
      DATE_ACHAT DATETIME,
      ID_VOL     VARCHAR(7)
    );
     
    declare @Vols table
    (
      DATE_VOL DATETIME,
      ID_VOL   VARCHAR(7),
      ID_AEP   VARCHAR(3)
    );
     
    insert into @Tickets (DATE_ACHAT, ID_VOL) values ('2010-05-01 11:00:00', 'AF447');
    insert into @Tickets (DATE_ACHAT, ID_VOL) values ('2010-05-01 11:35:00', 'AF445');
     
    insert into @Vols (DATE_VOL, ID_VOL, ID_AEP) values('2010-05-01 11:50:00', 'AF447', 'BKK');
    insert into @Vols (DATE_VOL, ID_VOL, ID_AEP) values('2010-05-02 12:35:00', 'AF447', 'RST');
    insert into @Vols (DATE_VOL, ID_VOL, ID_AEP) values('2010-05-03 13:32:00', 'AF447', 'KBL');
    insert into @Vols (DATE_VOL, ID_VOL, ID_AEP) values('2010-05-01 12:50:00', 'AF445', 'MRC');
    insert into @Vols (DATE_VOL, ID_VOL, ID_AEP) values('2010-05-02 13:35:00', 'AF445', 'NCE');
    insert into @Vols (DATE_VOL, ID_VOL, ID_AEP) values('2010-05-03 14:32:00', 'AF445', 'OSL');
     
    with SR (DATE_ACHAT, ID_VOL, ID_AEP, RN)
    as
    (
    select ti.DATE_ACHAT, ti.ID_VOL, vl.ID_AEP,
           row_number() over(partition by ti.ID_VOL order by vl.DATE_VOL asc)
      from @Tickets as ti
           inner join @Vols as vl
             on vl.ID_VOL = ti.ID_VOL
     where ti.DATE_ACHAT < vl.DATE_VOL
    )
    select DATE_ACHAT, ID_VOL, ID_AEP
      from SR
     where RN = 1;
     
    DATE_ACHAT              ID_VOL  ID_AEP
    ----------------------- ------- ------
    2010-05-01 11:35:00.000 AF445   MRC
    2010-05-01 11:00:00.000 AF447   BKK
    Avec un simple agrégat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      select ti.DATE_ACHAT, ti.ID_VOL, min(vl.ID_AEP) as ID_AEP
        from @Tickets as ti
             inner join @Vols as vl
               on vl.ID_VOL = ti.ID_VOL
       where ti.DATE_ACHAT < vl.DATE_VOL
    group by ti.DATE_ACHAT, ti.ID_VOL;

  7. #7
    Membre Expert

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    DECLARE @datesupp AS DATETIME
    SELECT @datesupp = MAX(DATE_VOL) FROM Vols
    SELECT DISTINCT t.DATE_ACHAT ,t.ID_VOL
    FROM Tickets t JOIN Vols v ON t.ID_VOL = v.ID_VOL
    WHERE t.DATE_ACHAT < @datesupp
    Attention si cette requête doit être intégré dans une application je te conseille de penser à une procédure stockée

    Lire ce que j'ai écrit ici

    A+
    Etienne ZINZINDOHOUE
    Billets-Articles

Discussions similaires

  1. requete complexe sql server
    Par adil_math2006 dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 14/06/2007, 10h39
  2. pb de connexion a l'analyseur de requete de SQL server
    Par houda86 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 06/04/2007, 11h23
  3. Resultat d'une requete DELETE SQL SERVER 2000
    Par Tronic dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 20/12/2006, 13h06
  4. Lenteur requetes ADO SQL server
    Par StarMusic dans le forum Bases de données
    Réponses: 10
    Dernier message: 11/08/2006, 13h43
  5. equivalence requete en sql server
    Par voyageur dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 14/12/2004, 16h08

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