Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/03/2007, 13h30   #1
Membre régulier
 
Avatar de jacquesh
 
Développeur informatique
Inscription : 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
Points : 82
Points : 82
Par défaut [DATE] - not between problem

bonjour,

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

soit 2 tables

Code :
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 :
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 :
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.
__________________
Citation:
En essayant continuellement on finit par réussir. Donc : plus ça rate, plus on a de chance que ça marche.
jacquesh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2007, 13h46   #2
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

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

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Bonjour,

Essaies ce code
Code :
1
2
3
4
5
 
SELECT *
  FROM a, b
 WHERE a.noip = b.noip 
     AND (b.datet < a.daentr OR  b.datet > a.dasor)
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2007, 14h01   #3
Membre régulier
 
Avatar de jacquesh
 
Développeur informatique
Inscription : 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
Points : 82
Points : 82
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... ?
__________________
Citation:
En essayant continuellement on finit par réussir. Donc : plus ça rate, plus on a de chance que ça marche.
jacquesh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2007, 14h08   #4
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

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

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
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
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2007, 14h32   #5
Membre éclairé
 
Inscription : 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
Points : 367
Points : 367
Citation:
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 :
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.
taska est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2007, 14h32   #6
Membre régulier
 
Avatar de jacquesh
 
Développeur informatique
Inscription : 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
Points : 82
Points : 82
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 :
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')) ;
__________________
Citation:
En essayant continuellement on finit par réussir. Donc : plus ça rate, plus on a de chance que ça marche.
jacquesh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2007, 15h22   #7
Membre régulier
 
Avatar de jacquesh
 
Développeur informatique
Inscription : 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
Points : 82
Points : 82
Citation:
Envoyé par taska
Code :
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... ?
__________________
Citation:
En essayant continuellement on finit par réussir. Donc : plus ça rate, plus on a de chance que ça marche.
jacquesh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2007, 15h30   #8
Membre éclairé
 
Inscription : 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
Points : 367
Points : 367
Citation:
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 :
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é ?
taska est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2007, 15h34   #9
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

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

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Bonjour ,
Oui, tu as raison, il peux nous induire en erreur
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2007, 15h54   #10
Expert Confirmé
 
Homme
Chef de projet en SSII
Inscription : janvier 2004
Messages : 2 866
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 866
Points : 3 448
Points : 3 448
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...
__________________
Un problème sans solution est un problème mal posé

Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2007, 16h04   #11
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

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

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
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
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2007, 16h47   #12
Membre régulier
 
Avatar de jacquesh
 
Développeur informatique
Inscription : 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
Points : 82
Points : 82
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..
__________________
Citation:
En essayant continuellement on finit par réussir. Donc : plus ça rate, plus on a de chance que ça marche.
jacquesh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2007, 16h56   #13
Membre éclairé
 
Inscription : 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
Points : 367
Points : 367
Citation:
Envoyé par jacquesh
alors que j'en attend bcp plus.
.. tu n'as qu'à en rajouter à la main ( sans le dire à personne ...)

CDLT.
taska est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2007, 17h18   #14
Expert Confirmé
 
Homme
Chef de projet en SSII
Inscription : janvier 2004
Messages : 2 866
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 866
Points : 3 448
Points : 3 448
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
__________________
Un problème sans solution est un problème mal posé

Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2007, 18h06   #15
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

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

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Bonjour ,

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

Code :
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
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2007, 18h14   #16
Membre éclairé
 
Inscription : 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
Points : 367
Points : 367
Citation:
Envoyé par salim11
essaie ce code, c'est mieux d'utiliser le curseur
???????

CDLT.
taska est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2007, 18h54   #17
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

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

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
salut,
Oui t'as raison , alors il faut utiliser le curseur
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2007, 19h24   #18
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

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

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Par défaut Solution

Bonjour,

Cette fois c'est la bonne, tu n'as pas besoin du curseur définitivement
Code :
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
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2007, 20h54   #19
Membre éclairé
 
Inscription : 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
Points : 367
Points : 367
Félicitations pour ta persévérance salim11

... et pourquoi ma requête n'est-elle pas bonne ?
Code :
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.
taska est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2007, 21h04   #20
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

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

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
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 :
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
Citation:
Code :
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 ??
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h21.


 
 
 
 
Partenaires

Hébergement Web