[SQL] selection des donnees qui ne remplissent pas une condition

selection des donnees qui ne remplissent pas une condition [SQL] - SQL/NoSQL - Programmation

Marsh Posté le 23-08-2004 à 17:01:48    

bonjour a tous :)
 
voila, j'ai 2 tables C et L et je dois selectionner des personnes dans C qui n'ont pas de reference dans L au dela d'une certaine date.
 
La date est dans L et je fais la liaison avec une cle commune aux 2 tables : L.REF et C.REF_ANN.
 
je reussi a selectionner les enregistrements de toutes les personnes de C ayant une reference dans L anterieure a la date mais je n'arrive pas a specifier qu'il ne faut pas qu'il y ait de reference au dela de cette date.
 
vous voyez comment faire :??: moi je bloque dessus et je suis pas specialiste sql :/
 
voila ma requete actuelle :
 

Code :
  1. SELECT L.REF, L.DATE_CREA, C.CONTACT,
  2. FROM C INNER JOIN L ON C.REF_ANN = L.REF
  3. WHERE (L.DATE_CREA < '01 / 06 / 2004') AND (L.REF LIKE 'LN%')
  4. ORDER BY L.DATE_CREA DESC


 
mille mercis d'avance :jap:


---------------
Tout ou rien mais rien que tout ! feed-back : http://forum.hardware.fr/forum2.ph [...] ost=121391
Reply

Marsh Posté le 23-08-2004 à 17:01:48   

Reply

Marsh Posté le 23-08-2004 à 17:14:13    

Salut,
 
Je ne sais pas quel est ton SGBD...
 
Mais essaye un  
Select * from C where
C.ref NOT IN(select L.ref from L where periode à ne pas prendre)

Reply

Marsh Posté le 23-08-2004 à 17:39:08    

Il suffit de faire une jointure externe de ce genre :
 

Code :
  1. SELECT L.REF, L.DATE_CREA, C.CONTACT,
  2.   FROM C
  3.   INNER JOIN L L1 ON C.REF_ANN = L1.REF
  4.   LEFT  JOIN L L2 ON C.REF_ANN = L2.REF
  5.   WHERE (L1.DATE_CREA < '01 / 06 / 2004')
  6.   AND (L1.REF LIKE 'LN%')
  7.   AND (L2.DATE_CREA >= '01 / 06 / 2004')
  8.   AND (L2.REF is NULL)
  9.   ORDER BY L.DATE_CREA DESC


 
En gros, si L2.REF est null, c'est qu'il n'y a pas de ligne dans L pour le contact, avec une date supérieure au 01/06/2004.
 
Y a sûrement des petites erreurs d'écriture, mais je te laisse les corriger.

Reply

Marsh Posté le 23-08-2004 à 17:53:31    

je suis sous MS SQL SERVER
 
apparemment, il a du mal a digerer la requete :/


---------------
Tout ou rien mais rien que tout ! feed-back : http://forum.hardware.fr/forum2.ph [...] ost=121391
Reply

Marsh Posté le 23-08-2004 à 17:57:47    

Beegee a écrit :

Il suffit de faire une jointure externe de ce genre :
 

Code :
  1. SELECT L.REF, L.DATE_CREA, C.CONTACT,
  2.   FROM C
  3.   INNER JOIN L L1 ON C.REF_ANN = L1.REF
  4.   LEFT  JOIN L L2 ON C.REF_ANN = L2.REF
  5.   WHERE (L1.DATE_CREA < '01 / 06 / 2004')
  6.   AND (L1.REF LIKE 'LN%')
  7.   AND (L2.DATE_CREA >= '01 / 06 / 2004')
  8.   AND (L2.REF is NULL)
  9.   ORDER BY L.DATE_CREA DESC


 
En gros, si L2.REF est null, c'est qu'il n'y a pas de ligne dans L pour le contact, avec une date supérieure au 01/06/2004.
 
Y a sûrement des petites erreurs d'écriture, mais je te laisse les corriger.


 
aucun resultat retourné  :sweat:


---------------
Tout ou rien mais rien que tout ! feed-back : http://forum.hardware.fr/forum2.ph [...] ost=121391
Reply

Marsh Posté le 24-08-2004 à 09:59:19    

:bounce:


---------------
Tout ou rien mais rien que tout ! feed-back : http://forum.hardware.fr/forum2.ph [...] ost=121391
Reply

Marsh Posté le 24-08-2004 à 11:18:53    

select C.*
FROM C
WHERE C.ID not in (select L.ID from L)
AND C.DATE_CREA > la_date
 
Pkoi se faire chier avec des trucs compliqués quand des trucs simples marchent :D
 
Pour remplacer le NOT IN qui est très lent, tu peux faire :
 
select C.*
FROM C
WHERE C.DATE_CREA > la_date
AND NOT EXISTS (SELECT NULL FROM L WHERE L.ID = C.ID)


Message édité par Arjuna le 24-08-2004 à 11:20:02
Reply

Marsh Posté le 24-08-2004 à 11:30:25    

Arjuna : la date de création est dans la table L ;)
 
Donc en gros, s'il peut faire des EXISTS, ça donnerait :
 

Code :
  1. SELECT L.REF, L.DATE_CREA, C.CONTACT
  2.   FROM C
  3.   INNER JOIN L ON C.REF_ANN = L.REF
  4.   WHERE L.DATE_CREA < '01 / 06 / 2004'
  5.   AND L.REF LIKE 'LN%'
  6.   AND NOT EXISTS (SELECT NULL
  7.                   FROM L
  8.                   WHERE C.REF_ANN = L.REF
  9.                   AND L.DATE_CREA >= '01 / 06 / 2004')
  10.   ORDER BY L.DATE_CREA DESC;


Message édité par Beegee le 24-08-2004 à 11:30:51
Reply

Marsh Posté le 24-08-2004 à 11:59:06    

Beegee a écrit :

Arjuna : la date de création est dans la table L ;)
 
Donc en gros, s'il peut faire des EXISTS, ça donnerait :
 

Code :
  1. SELECT L.REF, L.DATE_CREA, C.CONTACT
  2.   FROM C
  3.   INNER JOIN L ON C.REF_ANN = L.REF
  4.   WHERE L.DATE_CREA < '01 / 06 / 2004'
  5.   AND L.REF LIKE 'LN%'
  6.   AND NOT EXISTS (SELECT NULL
  7.                   FROM L
  8.                   WHERE C.REF_ANN = L.REF
  9.                   AND L.DATE_CREA >= '01 / 06 / 2004')
  10.   ORDER BY L.DATE_CREA DESC;



 
:jap:
 
mais apparemment, cette requette prend en compte des relations superieures au 01/06/2004 :( et je vois pas prq ...


---------------
Tout ou rien mais rien que tout ! feed-back : http://forum.hardware.fr/forum2.ph [...] ost=121391
Reply

Marsh Posté le 24-08-2004 à 12:33:50    

Essaie ça (avec des alias pour L, mais je trouve ça bizarre)
 
select L1.REF, L1.DATE_CREA, C.CONTACT  
FROM C, L1
WHERE L1.DATE_CREA < la_date  
AND L1 LIKE 'LN%'
AND NOT EXISTS (SELECT NULL FROM L2 WHERE L2.ID = C.ID AND L2.DATE_CREA >= la_date)

Reply

Marsh Posté le 24-08-2004 à 12:33:50   

Reply

Marsh Posté le 24-08-2004 à 12:34:30    

Sinon, PKOI tu mets des espaces autour des "/" ? A mon avis, t'as un problème de formattage de la date là...

Reply

Marsh Posté le 24-08-2004 à 12:39:30    

Arjuna a écrit :

Essaie ça (avec des alias pour L, mais je trouve ça bizarre)
 
select L1.REF, L1.DATE_CREA, C.CONTACT  
FROM C, L1
WHERE L1.DATE_CREA < la_date  
AND L1 LIKE 'LN%'
AND NOT EXISTS (SELECT NULL FROM L2 WHERE L2.ID = C.ID AND L2.DATE_CREA >= la_date)


 
Il te manque le nom de la table (L) :D
 
et +1 pour le formatage des dates ... c'est sûrement les espaces qui font que le résultat n'est pas correct ;)

Reply

Marsh Posté le 24-08-2004 à 14:14:52    

pour le formatage, c'est sql server enterprise qui les ajoute automatiquement :(


---------------
Tout ou rien mais rien que tout ! feed-back : http://forum.hardware.fr/forum2.ph [...] ost=121391
Reply

Marsh Posté le 24-08-2004 à 14:20:43    

je viens de faire un test et certaines ref en cause ont disparues mais j'ai retrouve des contacts qui ne devraient pas y etre
 
galere :fou:


---------------
Tout ou rien mais rien que tout ! feed-back : http://forum.hardware.fr/forum2.ph [...] ost=121391
Reply

Marsh Posté le 25-08-2004 à 11:08:36    

:(


---------------
Tout ou rien mais rien que tout ! feed-back : http://forum.hardware.fr/forum2.ph [...] ost=121391
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed