OVH Cloud OVH Cloud

Extraction avec criteres chaines de car.

4 réponses
Avatar
Olivier
bonjour,

tout nouveau en sql, je veux extraire tous les gens contenus dans ma base
SAUF ceux dont l'adresse postale n'est pas bonne (retour NPAI des PTT).

ces NPAI sont identifies dans la table "blocage_adresse" par les valeurs
suivantes :
"M" pour les adresses bloquees,
"1" pour celles qui n'ont fait que 1 fois l'objet d'un retour NPAI
"2" pour celles dont c'est la 2eme fois qu'elles reviennent en NPAI.

j'ai donc ecris :
...
where
blocage_adresse.libelle_blocage not in ('M','1','2')

mais ca marche pas !
pourtant si je comprends bien, je dis d'extraire tous les gens dont le
libelle_blocage n'est pas l'une des valeurs que j'indique. alors comme ca
marche pas, je galere depuis pas mal de temps sur mon critere d'extraction

qqu'un pourrait-il m'aider a l'aide de la requete adequate et si possible
commentee que je comprenne ou est mon erreur ?
merci par avance.

4 réponses

Avatar
Philippe T [MS]
Bonjour,

SELECT *
FROM MesAdresse
WHERE ID_ADRESSE NOT IN (SELECT ID_ADRESSE FROM blocage_adresse WHERE
libelle_blocage not in ('M','1','2') )

Phil.
________________________________________________________
Philippe TROTIN http://blogs.msdn.com/ptrotin
Microsoft Services France http://www.microsoft.com/france

"Olivier" wrote in message
news:4218dc6e$0$12427$
bonjour,

tout nouveau en sql, je veux extraire tous les gens contenus dans ma base
SAUF ceux dont l'adresse postale n'est pas bonne (retour NPAI des PTT).

ces NPAI sont identifies dans la table "blocage_adresse" par les valeurs
suivantes :
"M" pour les adresses bloquees,
"1" pour celles qui n'ont fait que 1 fois l'objet d'un retour NPAI
"2" pour celles dont c'est la 2eme fois qu'elles reviennent en NPAI.

j'ai donc ecris :
...
where
blocage_adresse.libelle_blocage not in ('M','1','2')

mais ca marche pas !
pourtant si je comprends bien, je dis d'extraire tous les gens dont le
libelle_blocage n'est pas l'une des valeurs que j'indique. alors comme ca
marche pas, je galere depuis pas mal de temps sur mon critere d'extraction

qqu'un pourrait-il m'aider a l'aide de la requete adequate et si possible
commentee que je comprenne ou est mon erreur ?
merci par avance.




Avatar
Olivier
Bonsoir,

Un grand merci pour l'aide apporte par Philippe mais ca marche pas...
Voici donc l'integralite de ma requete SQL en vous remerciant de me dire la
ou ca cloche...

SELECT DISTINCT
c.LIBELLE_CIVILITE,
p.NOM_BENEFICIAIRE nom,
nls_initcap(p.PRENOM_BENEFICIAIRE) prenom,
nvl(a.LIGNE_ADRESSE_1,' ') ligne_adresse_1,
nvl(a.LIGNE_ADRESSE_2,' ') ligne_adresse_2,
nvl(a.LIGNE_ADRESSE_3,' ') ligne_adresse_3,
nvl(a.LIGNE_ADRESSE_4,' ') ligne_adresse_4,
nvl(a.LIGNE_ADRESSE_5,' ') ligne_adresse_5,
HISTO_MATRICULE.NUMERO_MATRICULE matricule,
p.NUMERO_BENEFICIAIRE
FROM
POSITION,
SECTION,
BENEFICIAIRE p,
HISTO_MATRICULE,
CIVILITE c,
ADRESSE a,
FAMILLE f,
HISTO_FAMILLE,
BLOCAGE_ADRESSE
WHERE
( BLOCAGE_ADRESSE.CODE_BLOCAGE != 'M' OR BLOCAGE_ADRESSE.CODE_BLOCAGE ! '1' OR BLOCAGE_ADRESSE.CODE_BLOCAGE != '2' )
AND ( HISTO_FAMILLE.NUMERO_BENEFICIAIRE=p.NUMERO_BENEFICIAIRE )
AND ( HISTO_MATRICULE.NUMERO_FAMILLE=f.NUMERO_FAMILLE )
AND ( c.CODE_CIVILITE=p.CODE_CIVILITE )
AND ( a.NUMERO_ADRESSE=p.NUMERO_ADRESSE_BEN )
AND ( f.NUMERO_FAMILLE=HISTO_FAMILLE.NUMERO_FAMILLE )
AND ( p.CODE_ASSURE = 1 )
AND ( p.DATE_DECES IS NULL )
AND ( p.DATE_NAISSANCE_BENEFICIAIRE > '31/12/1959' AND
p.DATE_NAISSANCE_BENEFICIAIRE < '01/01/1988' )
AND ( HISTO_MATRICULE.DATE_FIN_MATRICULE is null )
and (p.code_section = section.code_section)
and ( POSITION.CODE_POSITION = 'AD' OR POSITION.CODE_POSITION = 'AP' OR
POSITION.CODE_POSITION ='PM' )
ORDER BY
2,3;



"Philippe T [MS]" a écrit dans le message de
news:
Bonjour,

SELECT *
FROM MesAdresse
WHERE ID_ADRESSE NOT IN (SELECT ID_ADRESSE FROM blocage_adresse WHERE
libelle_blocage not in ('M','1','2') )

Phil.
________________________________________________________
Philippe TROTIN http://blogs.msdn.com/ptrotin
Microsoft Services France http://www.microsoft.com/france

"Olivier" wrote in message
news:4218dc6e$0$12427$
> bonjour,
>
> tout nouveau en sql, je veux extraire tous les gens contenus dans ma


base
> SAUF ceux dont l'adresse postale n'est pas bonne (retour NPAI des PTT).
>
> ces NPAI sont identifies dans la table "blocage_adresse" par les valeurs
> suivantes :
> "M" pour les adresses bloquees,
> "1" pour celles qui n'ont fait que 1 fois l'objet d'un retour NPAI
> "2" pour celles dont c'est la 2eme fois qu'elles reviennent en NPAI.
>
> j'ai donc ecris :
> ...
> where
> blocage_adresse.libelle_blocage not in ('M','1','2')
>
> mais ca marche pas !
> pourtant si je comprends bien, je dis d'extraire tous les gens dont le
> libelle_blocage n'est pas l'une des valeurs que j'indique. alors comme


ca
> marche pas, je galere depuis pas mal de temps sur mon critere


d'extraction
>
> qqu'un pourrait-il m'aider a l'aide de la requete adequate et si


possible
> commentee que je comprenne ou est mon erreur ?
> merci par avance.
>
>




Avatar
Philippe T [MS]
Bonjour,

Attention, le fait de mettre des "," entre les différentes tables de la
clause FROM si il n'y a pas de jointures entre ces tables via des jointures
JOIN ou des jointures dans la clause WHERE va produir des produits
cartésiens entre les constituants de ces tables !!!

Exemple :

SELECT *
FROM Table1
INNER JOIN Table2 ON Table1.ID_1 = Table2.ID_1
INNER JOIN Table3 ON Table2.ID_2 = Table3.ID_2
WHERE Tables2.ID_2 NOT IN (SELECT ID_2 FROM MaTableInterdit WHERE MonChamp 'M' OR MonChamp = '1' ...)

Phil.
________________________________________________________
Philippe TROTIN http://blogs.msdn.com/ptrotin
Microsoft Services France http://www.microsoft.com/france

"Olivier" wrote in message
news:421900a1$0$29161$
Bonsoir,

Un grand merci pour l'aide apporte par Philippe mais ca marche pas...
Voici donc l'integralite de ma requete SQL en vous remerciant de me dire


la
ou ca cloche...

SELECT DISTINCT
c.LIBELLE_CIVILITE,
p.NOM_BENEFICIAIRE nom,
nls_initcap(p.PRENOM_BENEFICIAIRE) prenom,
nvl(a.LIGNE_ADRESSE_1,' ') ligne_adresse_1,
nvl(a.LIGNE_ADRESSE_2,' ') ligne_adresse_2,
nvl(a.LIGNE_ADRESSE_3,' ') ligne_adresse_3,
nvl(a.LIGNE_ADRESSE_4,' ') ligne_adresse_4,
nvl(a.LIGNE_ADRESSE_5,' ') ligne_adresse_5,
HISTO_MATRICULE.NUMERO_MATRICULE matricule,
p.NUMERO_BENEFICIAIRE
FROM
POSITION,
SECTION,
BENEFICIAIRE p,
HISTO_MATRICULE,
CIVILITE c,
ADRESSE a,
FAMILLE f,
HISTO_FAMILLE,
BLOCAGE_ADRESSE
WHERE
( BLOCAGE_ADRESSE.CODE_BLOCAGE != 'M' OR BLOCAGE_ADRESSE.CODE_BLOCAGE ! > '1' OR BLOCAGE_ADRESSE.CODE_BLOCAGE != '2' )
AND ( HISTO_FAMILLE.NUMERO_BENEFICIAIRE=p.NUMERO_BENEFICIAIRE )
AND ( HISTO_MATRICULE.NUMERO_FAMILLE=f.NUMERO_FAMILLE )
AND ( c.CODE_CIVILITE=p.CODE_CIVILITE )
AND ( a.NUMERO_ADRESSE=p.NUMERO_ADRESSE_BEN )
AND ( f.NUMERO_FAMILLE=HISTO_FAMILLE.NUMERO_FAMILLE )
AND ( p.CODE_ASSURE = 1 )
AND ( p.DATE_DECES IS NULL )
AND ( p.DATE_NAISSANCE_BENEFICIAIRE > '31/12/1959' AND
p.DATE_NAISSANCE_BENEFICIAIRE < '01/01/1988' )
AND ( HISTO_MATRICULE.DATE_FIN_MATRICULE is null )
and (p.code_section = section.code_section)
and ( POSITION.CODE_POSITION = 'AD' OR POSITION.CODE_POSITION = 'AP' OR
POSITION.CODE_POSITION ='PM' )
ORDER BY
2,3;



"Philippe T [MS]" a écrit dans le message


de
news:
> Bonjour,
>
> SELECT *
> FROM MesAdresse
> WHERE ID_ADRESSE NOT IN (SELECT ID_ADRESSE FROM blocage_adresse WHERE
> libelle_blocage not in ('M','1','2') )
>
> Phil.
> ________________________________________________________
> Philippe TROTIN http://blogs.msdn.com/ptrotin
> Microsoft Services France http://www.microsoft.com/france
>
> "Olivier" wrote in message
> news:4218dc6e$0$12427$
> > bonjour,
> >
> > tout nouveau en sql, je veux extraire tous les gens contenus dans ma
base
> > SAUF ceux dont l'adresse postale n'est pas bonne (retour NPAI des


PTT).
> >
> > ces NPAI sont identifies dans la table "blocage_adresse" par les


valeurs
> > suivantes :
> > "M" pour les adresses bloquees,
> > "1" pour celles qui n'ont fait que 1 fois l'objet d'un retour NPAI
> > "2" pour celles dont c'est la 2eme fois qu'elles reviennent en NPAI.
> >
> > j'ai donc ecris :
> > ...
> > where
> > blocage_adresse.libelle_blocage not in ('M','1','2')
> >
> > mais ca marche pas !
> > pourtant si je comprends bien, je dis d'extraire tous les gens dont le
> > libelle_blocage n'est pas l'une des valeurs que j'indique. alors comme
ca
> > marche pas, je galere depuis pas mal de temps sur mon critere
d'extraction
> >
> > qqu'un pourrait-il m'aider a l'aide de la requete adequate et si
possible
> > commentee que je comprenne ou est mon erreur ?
> > merci par avance.
> >
> >
>
>




Avatar
Fred BROUARD
nvl est une fonction Oracle qui n'existe pas en SQL. La norme SQL précise
COALESCE qui est accepté par MS SQL Server.
nls_initcap de même est une fonctioàn spécifique à Oracle et le concept de nls
n'a rien à voir vaec la norme SQL qui parle de jeu de caractères et de collations.

les jointures de table doivent se faire dans une clause JOIN (syntexe normative
depuis 1992 !).

En particulier dans ta requête la table position n'est jointe à aucune autre et
un produit cartésien est créé !

A lire :
http://sqlpro.developpez.com/cours/sqlaz/jointures/#L2

A +

--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************

Olivier a écrit:
Bonsoir,

Un grand merci pour l'aide apporte par Philippe mais ca marche pas...
Voici donc l'integralite de ma requete SQL en vous remerciant de me dire la
ou ca cloche...

SELECT DISTINCT
c.LIBELLE_CIVILITE,
p.NOM_BENEFICIAIRE nom,
nls_initcap(p.PRENOM_BENEFICIAIRE) prenom,
nvl(a.LIGNE_ADRESSE_1,' ') ligne_adresse_1,
nvl(a.LIGNE_ADRESSE_2,' ') ligne_adresse_2,
nvl(a.LIGNE_ADRESSE_3,' ') ligne_adresse_3,
nvl(a.LIGNE_ADRESSE_4,' ') ligne_adresse_4,
nvl(a.LIGNE_ADRESSE_5,' ') ligne_adresse_5,
HISTO_MATRICULE.NUMERO_MATRICULE matricule,
p.NUMERO_BENEFICIAIRE
FROM
POSITION,
SECTION,
BENEFICIAIRE p,
HISTO_MATRICULE,
CIVILITE c,
ADRESSE a,
FAMILLE f,
HISTO_FAMILLE,
BLOCAGE_ADRESSE
WHERE
( BLOCAGE_ADRESSE.CODE_BLOCAGE != 'M' OR BLOCAGE_ADRESSE.CODE_BLOCAGE ! > '1' OR BLOCAGE_ADRESSE.CODE_BLOCAGE != '2' )
AND ( HISTO_FAMILLE.NUMERO_BENEFICIAIRE=p.NUMERO_BENEFICIAIRE )
AND ( HISTO_MATRICULE.NUMERO_FAMILLE=f.NUMERO_FAMILLE )
AND ( c.CODE_CIVILITE=p.CODE_CIVILITE )
AND ( a.NUMERO_ADRESSE=p.NUMERO_ADRESSE_BEN )
AND ( f.NUMERO_FAMILLE=HISTO_FAMILLE.NUMERO_FAMILLE )
AND ( p.CODE_ASSURE = 1 )
AND ( p.DATE_DECES IS NULL )
AND ( p.DATE_NAISSANCE_BENEFICIAIRE > '31/12/1959' AND
p.DATE_NAISSANCE_BENEFICIAIRE < '01/01/1988' )
AND ( HISTO_MATRICULE.DATE_FIN_MATRICULE is null )
and (p.code_section = section.code_section)
and ( POSITION.CODE_POSITION = 'AD' OR POSITION.CODE_POSITION = 'AP' OR
POSITION.CODE_POSITION ='PM' )
ORDER BY
2,3;



"Philippe T [MS]" a écrit dans le message de
news:

Bonjour,

SELECT *
FROM MesAdresse
WHERE ID_ADRESSE NOT IN (SELECT ID_ADRESSE FROM blocage_adresse WHERE
libelle_blocage not in ('M','1','2') )

Phil.
________________________________________________________
Philippe TROTIN http://blogs.msdn.com/ptrotin
Microsoft Services France http://www.microsoft.com/france

"Olivier" wrote in message
news:4218dc6e$0$12427$

bonjour,

tout nouveau en sql, je veux extraire tous les gens contenus dans ma





base

SAUF ceux dont l'adresse postale n'est pas bonne (retour NPAI des PTT).

ces NPAI sont identifies dans la table "blocage_adresse" par les valeurs
suivantes :
"M" pour les adresses bloquees,
"1" pour celles qui n'ont fait que 1 fois l'objet d'un retour NPAI
"2" pour celles dont c'est la 2eme fois qu'elles reviennent en NPAI.

j'ai donc ecris :
...
where
blocage_adresse.libelle_blocage not in ('M','1','2')

mais ca marche pas !
pourtant si je comprends bien, je dis d'extraire tous les gens dont le
libelle_blocage n'est pas l'une des valeurs que j'indique. alors comme





ca

marche pas, je galere depuis pas mal de temps sur mon critere





d'extraction

qqu'un pourrait-il m'aider a l'aide de la requete adequate et si





possible

commentee que je comprenne ou est mon erreur ?
merci par avance.