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

Oracle Discussion :

[DATE] - not between problem


Sujet :

Oracle

  1. #1
    Membre éclairé Avatar de jacquesh
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    269
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2005
    Messages : 269
    Par défaut [DATE] - not between problem
    bonjour,

    j'ai un problème avec la création d'une requete :

    soit 2 tables

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Table A :
    NOIP       DAENTR   DASOR
    ---------- -------- --------
    1100030511 22/08/00 24/08/00
    1100030511 09/07/02 19/07/02
    1100030511 29/08/02 05/10/02
    1100030511 14/01/06 20/01/06
    1100030511 01/03/06 03/03/06
    1100030511 08/03/06 31/03/06
    1100030511 03/05/06 17/07/06
    1100030511 05/03/07 13/03/07
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Table B:
     
    NOIP       LABO_PARAM       VALEUR     UNITE    R DATER    DATET
    ---------- ---------------- ---------- -------- - -------- --------
    1100030511 BINA             141        mmol/l   R 06/03/07 06/03/07
    1100030511 BIK              xxx        mmol/l   R 06/03/07 06/03/07
    1100030511 BICL             101        mmol/l   R 06/03/07 06/03/07
    ...
    ==

    Ce que la requete doit exprimer.

    Recupérer tous les tubles de la table B où DATET n'est incluse dans aucune periode de la table A (de DAENTR à DASOR) pour un NOIP donné.

    Ma requete (qui est fausse) est la suivante!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from A,B where A.noip=B.noip and B.datet not between a.daentr and a.dasor.
    quelqu'un a t il une solution ??

    merci d'avance.

  2. #2
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut
    Bonjour,

    Essaies ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT *
      FROM a, b
     WHERE a.noip = b.noip 
         AND (b.datet < a.daentr or  b.datet > a.dasor)

  3. #3
    Membre éclairé Avatar de jacquesh
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    269
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2005
    Messages : 269
    Par défaut
    déjà essayer.. meme resultat

    cette requete exprime le besoin suivant

    Recupérer tous les tubles de la table B où DATET n'est incluse dans le tuple où datet n'est pas dans la periode de la table A (de DAENTR à DASOR) pour un NOIP donné.

    par exemple :
    si on a dans la table a
    ligne1 - 01/01/05 01/03/05
    ligne2 - 05/03/05 01/05/05

    et dans la table b
    ligne1 - 06/03/05

    avec nos requetes nous aurons comme retour la ligne 1 parce que 06/03/05 n'est pas dans la tranche alors qu'une requete correcte ne retournerai pas de tuble...

    autre idée... ?

  4. #4
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut
    Bonjour ,

    Tu peux me donner ton script de creation des tables et le contenu de ces dernières?

    Je m'execuse je suis trés visuel

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 349
    Par défaut
    Recupérer tous les tubles de la table B où DATET n'est incluse dans aucune periode de la table A (de DAENTR à DASOR) pour un NOIP donné.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Select *
    from B
    where not exists ( select rowid from a
    	  	          where b.noip = a.noip 
    			  and b.datet between a.daentr and a.dasor )

    CDLT.

  6. #6
    Membre éclairé Avatar de jacquesh
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    269
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2005
    Messages : 269
    Par défaut
    en fait c une vue d'une base de plusieurs Go. (la base n'est pas de moi - je creer juste des VM)

    voila un exemplede creation bidon..

    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
     
     
     
    DROP TABLE A ;
    CREATE TABLE A (
    	name	varchar2(20),
    	date_entree	date,
    	date_sortie	date
    ) ;
     
    DROP TABLE B ;
    CREATE TABLE B (
    	name	varchar2(20),
    	date_prelev	date
    ) ;
     
     
    INSERT INTO A VALUES ('123456789',TO_DATE('22/08/00','DD/MM/YY'),TO_DATE('24/08/00','DD/MM/YY')) ;
    INSERT INTO A VALUES ('123456789',TO_DATE('08/03/06','DD/MM/YY'),TO_DATE('31/03/06','DD/MM/YY')) ;
     
    INSERT INTO B VALUES ('123456789',TO_DATE('23/08/06','DD/MM/YY')) ;
    INSERT INTO B VALUES ('123456789',TO_DATE('24/08/06','DD/MM/YY')) ;
    INSERT INTO B VALUES ('123456789',TO_DATE('25/08/06','DD/MM/YY')) ;
    INSERT INTO B VALUES ('123456789',TO_DATE('26/08/06','DD/MM/YY')) ;
    INSERT INTO B VALUES ('123456789',TO_DATE('27/08/06','DD/MM/YY')) ;
    INSERT INTO B VALUES ('123456789',TO_DATE('28/08/06','DD/MM/YY')) ;
    INSERT INTO B VALUES ('123456789',TO_DATE('07/03/06','DD/MM/YY')) ;
    INSERT INTO B VALUES ('123456789',TO_DATE('08/03/06','DD/MM/YY')) ;
    INSERT INTO B VALUES ('123456789',TO_DATE('09/03/06','DD/MM/YY')) ;

  7. #7
    Membre éclairé Avatar de jacquesh
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    269
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2005
    Messages : 269
    Par défaut
    Citation Envoyé par taska
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Select *
    from B
    where not exists ( select rowid from a
    	  	          where b.noip = a.noip 
    			  and b.datet between a.daentr and a.dasor )

    CDLT.
    ca a pas l'air de marché...mais tu fait une requete sur la table B avec un select rowid sur A ??? je ne crois pas que l'on peut trouver une réponse positive ??

    >> salim 11 <<
    pourquoi chercher le max ?? l'objetif est d'esclure certaine période pas forcément continue... ?

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 349
    Par défaut
    Recupérer tous les tubles de la table B où DATET n'est incluse dans aucune periode de la table A (de DAENTR à DASOR) pour un NOIP donné.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM B WHERE NOT EXISTS ( SELECT rowid FROM a WHERE b.noip = a.noip AND b.datet BETWEEN a.daentr AND a.dasor )

    ... selectionne tous les enregistrement de la table b pour lesquels n'existe pas la condition : ( selectionnne rowid (c'est + rapide!) de la table a où b.noip = a.noip et b.datet est entre a.daentr et a.dasor )

    Ce n'est pas ce qui est demandé ?

  9. #9
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut
    Bonjour ,
    Oui, tu as raison, il peux nous induire en erreur

  10. #10
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Citation Envoyé par taska
    selectionnne rowid (c'est + rapide!)
    Non, dans ce cas précis ce n'est pas vrai. Si tu mets "exists (select null" ou "exists (select 1" c'est tout aussi rapide et en général plus clair.

    Par contre par rapport au besoin exprimé, la requête de taska me semble correcte. Peux-tu être plus précis que "ca a pas l'air de marché" ? On n'est pas devin...

  11. #11
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut
    Salut,

    La meilleure solution, c'est d'utiliser un curseur dans une procedure pour vérifier pour chaque dateprlev de la table B toutes les périodes de la table A

  12. #12
    Membre éclairé Avatar de jacquesh
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    269
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2005
    Messages : 269
    Par défaut
    Citation Envoyé par salim11
    Salut,

    La meilleure solution, c'est d'utiliser un curseur dans une procedure pour vérifier pour chaque dateprlev de la table B toutes les périodes de la table A

    c que que j'était en train de me dire.. vu qu'avec la requete proposer je n'ai pas bcp de réponse (alors que j'en attend bcp plus.)

    vé tester..

  13. #13
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 349
    Par défaut
    Citation Envoyé par jacquesh
    alors que j'en attend bcp plus.
    .. tu n'as qu'à en rajouter à la main ( sans le dire à personne ...)

    CDLT.

  14. #14
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Citation Envoyé par jacquesh
    c que que j'était en train de me dire.. vu qu'avec la requete proposer je n'ai pas bcp de réponse (alors que j'en attend bcp plus.)
    Si tu nous disais ce qui ne va pas dans la requête proposée, on avancerait peut-être... Parce que faire un curseur quand cela peut-être fait en SQL, c'est quand même moyen, surtout au niveau temps de réponse

  15. #15
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut
    Bonjour ,

    essaie ce code, c'est mieux d'utiliser le curseur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT *
      FROM b
    MINUS
    SELECT b.NAME, date_prelev
      FROM b, a
     WHERE a.NAME = b.NAME
       AND b.date_prelev BETWEEN a.date_entree AND a.date_sortie

  16. #16
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 349
    Par défaut
    Citation Envoyé par salim11
    essaie ce code, c'est mieux d'utiliser le curseur
    ???????

    CDLT.

  17. #17
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut
    salut,
    Oui t'as raison , alors il faut utiliser le curseur

  18. #18
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut Solution
    Bonjour,

    Cette fois c'est la bonne, tu n'as pas besoin du curseur définitivement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select *
    from b
    minus 
    SELECT b.NAME, date_prelev
      FROM b, a
     WHERE a.NAME = b.NAME
       AND b.date_prelev BETWEEN a.date_entree AND a.date_sortie

  19. #19
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 349
    Par défaut
    Félicitations pour ta persévérance salim11

    ... et pourquoi ma requête n'est-elle pas bonne ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM B WHERE NOT EXISTS ( SELECT rowid FROM a WHERE b.noip = a.noip AND b.datet BETWEEN a.daentr AND a.dasor )


    CDLT.

  20. #20
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut
    Salut,

    Sincérement j'ai pensé qu'elle marche pas, sinon pourquoi j'ai continué à chercher .

    Mais c'est bien c'est une autre solution, notre ami aura le choix

    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
    Citation:
    
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    12345678910
     
    taska a écrit :
    Code :
    SELECT *
    FROM B
    WHERE NOT EXISTS ( SELECT rowid FROM a
    	  	          WHERE b.noip = a.noip 
    			  AND b.datet BETWEEN a.daentr AND a.dasor )
     
    CDLT.
    ca a pas l'air de marché...mais tu fait une requete sur la table B avec un select rowid sur A ??? je ne crois pas que l'on peut trouver une réponse positive ??

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Acces probleme de Date avec Between
    Par kahya dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 03/05/2007, 16h26
  2. Date et format (PROBLEME)
    Par Mynautor dans le forum DB2
    Réponses: 2
    Dernier message: 19/10/2006, 14h34
  3. Réponses: 1
    Dernier message: 05/10/2006, 04h20
  4. Réponses: 4
    Dernier message: 13/02/2006, 18h58
  5. [SQL] date et between
    Par masseur dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 03/02/2006, 09h49

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