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

Langage SQL Discussion :

Requête SQL : comparaison de deux dates dans deux tables distinctes


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 163
    Par défaut Requête SQL : comparaison de deux dates dans deux tables distinctes
    Bonjour,

    Je fais face à un problème que je pense complexe... en fait, je ne trouve pas de solution, me demandant s'il y en a une.

    J'ai deux tables ADRESSEENVOI et ADRESSEFACTURATION qui comportent respectivement les adresses d'envoi de marchandises et les adresses de facturation. Ces deux tables peuvent être jointes par l'attribut IDCLIENT, clé étrangère fournie par une autre table qui n'entre pas ici dans la problématique.

    Chaque adresse des deux tables est définie par plusieurs attributs dont :
    - le code marchandise (CDMARCH)
    - la date d'effet (DTEFFET)
    - la date d'invalidation (DTINVALIDATION)

    Un client donnant une adresse valide indique un CDMARCH. Le système génère une ADRESSEENVOI ou une ADRESSEFACTURATION, et initie la DTEFFET à la date du jour et la DTINVALIDATION à NULL.

    Un client peut demander de retirer une telle adresse, auquel cas la DTINVALIDATION est remplie à la date du traitement.

    Pour un même CDMARCH, un client peut avoir plusieurs adresses valides (bonjour la gestion !), c'est ce qui cause la difficulté. Car il me faut dans ma requête prendre la plus récente.

    Il m'est demandé de fournir les (IDCLIENT, CDMARCH) dont la date l'ADRESSEENVOI la plus récente soit plus récente que la DATEFACTURATION (donc les adresses avec DTINVALIDATION = NULL).

    J'espère être clair dans ce que je cherche.

    En outre je cherche à faire un regroupement par CDMARCH et sélectionner la date la plus jeune dans chaque table pour comparer ensuite.

    Je ne sais pas ce que la direction fait d'une telle requête, mais elle le veut avant la fin de cette présente semaine...

    Si quelqu'un pouvait m'aider, je l'en remercie vivement d'avance. Si jamais c'est impossible, je n'aurais d'autre choix que de le faire en Java/Hibernate.

  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
    Quel est votre SGBD ?

    Quelle requête avez-vous commencé à écrire ?
    Elle n'est pas triviale mais pas difficile non plus.

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 163
    Par défaut
    Bonjour,

    Je suis en Oracle 10g.

    La première requête que j'ai faite tourne depuis environ 7 heures et n'a rien donné :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT E.IDOCFI, E.CDOBLIG
    FROM ADRESSEENVOI E, ADRESSEFACTURATION F
    WHERE
    E.IDCLIENT = F.IDCLIENT AND
    E.DTINVALIDATION IS NULL AND
    F.DTINVALIDATION IS NULL AND
    E.CDMARCH = F.CDMARCH AND
    (
       (SELECT MAX(E.DTEFFET) FROM ADRESSEENVOI E1
       WHERE E1.IDCLIENT = E.IDCLIENT AND E1.CDOBLIG = E.CDOBLIG) > 
       (SELECT MAX(F.DTEFFET) FROM ADRESSEFACTURATION F1
       WHERE F1.IDCLIENT = F.IDCLIENT AND F1.CDOBLIG = F.CDOBLIG)
    )
    Les deux tables contiennent quelque chose comme 600000 instances chacune. J'ai bien conscience que la requête formulée est certainement incomplète et naïve, sans aucune optimalité.

    Merci de votre aide.

  4. #4
    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
    Le select ne correspond pas vraiment à votre expression de besoin.
    Quels sont les index et clefs présents sur les deux tables ?

  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
    22 002
    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 : 22 002
    Billets dans le blog
    6
    Par défaut
    Pour trouver l'adresse valide la plus récente il serait beaucoup plus efficace de faire un ROW_NUMBER() OVER(ORDER BY E.DTEFFET DESC) AS N puis de filtrer sur N = 1.

    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
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 163
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Pour trouver l'adresse valide la plus récente il serait beaucoup plus efficace de faire un ROW_NUMBER() OVER(ORDER BY E.DTEFFET DESC) AS N puis de filtrer sur N = 1.

    A +
    Bonjour,

    Merci pour ce conseil, je vais lire la doc pour utiliser ROW_NUMBER.

    En effet, j'ai un niveau scolaire en SQL... et donc à part des SELECT, UPDATE et INSERT "basiques", je ne sais pas faire grand chose.

    Bonne journée

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 163
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Le select ne correspond pas vraiment à votre expression de besoin.
    Quels sont les index et clefs présents sur les deux tables ?
    C'est très probable que cela ne corresponde pas car mon niveau en SQL est très faible. La seule personne susceptible de m'aider est partie depuis plusieurs mois et n'a pas encore été remplacée. Mais revenons aux faits.

    Chacune des tables contient deux clés étrangères :
    IDCLIENT
    IDADRTOPO

    Cette seconde clé permet de coder une adresse géographique pour déterminer des villes distinctes partageant le même nom, comme par exemple Paris.

    Quant aux index, la description sous TOAD m'en indique quatre pour ADRESSEENVOI:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    IX_ADE_DTMAJ_CDOBLIG column DTMAJ
    IX_ADE_DTMAJ_CDOBLIG column CDMARCH
    IX_AD_IDCLIENT_DTEFFET column IDCLIENT
    IX_AD_IDCLIENT_DTEFFET column DTEFFET
    Cinq index pour ADRESSEFACTURATION :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    IX_ADF_DTMAJ_CDMARCH column DTMAJ
    IX_ADF_DTMAJ_CDMARCH column CDMARCH
    IX_ADF_IDADRTOPO column IDADRTOPO
    IX_ADF_IDCLIENT_DTEFFET column IDCLIENT
    IX_ADF_IDCLIENT_DTEFFET column DTEFFET
    Est-ce que cela vous convient ?

    Merci par avance.

Discussions similaires

  1. Requête sql server pour calculer moyenne entre deux dates
    Par JérômeKGS dans le forum Développement
    Réponses: 2
    Dernier message: 17/04/2015, 12h04
  2. [TOS 3.2.0] Date between deux dates dans un tmap
    Par atb dans le forum Développement de jobs
    Réponses: 6
    Dernier message: 04/11/2009, 16h06
  3. [Requête/SQL]ajouter un champ calculé dans une table
    Par zougna dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 17/04/2007, 19h09
  4. Comparaison entre deux dates dans une table
    Par Biskot75 dans le forum Access
    Réponses: 6
    Dernier message: 19/09/2006, 11h16
  5. DateDiff avec 2 dates dans 2 tables distinctes
    Par delff dans le forum Access
    Réponses: 2
    Dernier message: 24/07/2006, 09h25

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