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

SQL Oracle Discussion :

Condition sur un champ construit


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2004
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 80
    Par défaut Condition sur un champ construit
    Bonjour a tous,
    Sous Oracle, je dois faire une condition telle que POR_RECIBIR<>0.
    Je ne sais pas comment faire, il me dit que la colonne n existe pas.
    Je donne le nom POR_RECIBIR A la requete :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT  DISTINCT  P.NO_PEDIDO PEDIDO,  ...
    		(SELECT COUNT(*)  FROM TARJETAS@TUCA TJ  
    		WHERE  NNUM_PEDIDO_ORIGEN = NO_PEDIDO) POR_RECIBIR,  
     
    FROM  CLIENTES_CONTRATOS@TUCA CC,  
    WHERE CC.NO_CONTRATO = P.CC_NO_CONTRATO
    J ai simplifie la requete pour plus de clarte, mais le concept reste le meme.
    La vrai requete se trouve ici :

    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
    SELECT  DISTINCT  P.NO_PEDIDO PEDIDO,  PR.DESCRIPCION PRODUCTO,  PR.CVE_PRODUCTO CVEPRODUCTO,  
    		(SELECT COUNT(*)  FROM TARJETAS@TUCA TJ  
    		WHERE TJ.FECHA_BAJA IS NULL  
    		AND TJ.VTB_CVE_BAJA IS NULL  
    		AND (TJ.VTB_CVE_BAJA IS NOT NULL OR TJ.VTB_CVE_BAJA IS NULL )  
    		AND (TJ.par_ped_no_pedido = P.NO_PEDIDO  OR TJ.PAR_PED_NO_PEDIDO IN (SELECT NNUM_PEDIDO_SUST  
    								  				 						 	FROM SET_DEXTRAVIO_PEDIDOS@tuca  
    																			WHERE NNUM_PEDIDO_ORIGEN = P.NO_PEDIDO))) POR_RECIBIR,  
    P.CC_NO_CONTRATO CONTRATO  
    FROM  CLIENTES_CONTRATOS@TUCA CC,  
    PEDIDOS@TUCA P,  PRODUCTOS@TUCA PR,  VIEW_TIPOS_PEDIDOS@TUCA VTP,  TIPOS_PEDIDOS_PRODUCTOS@TUCA TPP,  CLIENTES@TUCA CL  
    WHERE CC.NO_CONTRATO = P.CC_NO_CONTRATO  AND CC.PRD_CVE_PRODUCTO = PR.CVE_PRODUCTO  
    AND PR.CVE_PRODUCTO <> 23
    AND P.ESPECIAL = 'STJ'  
    AND P.ESPECIAL = VTP.CVE_TIPO  
    AND P.RECEP_TARJ_CTE = 'S'  AND VTP.CVE_TIPO = TPP.VTP_CVE_TIPO  AND CC.CLI_NO_CLIENTE = CL.NO_CLIENTE  AND TPP.CVE_SUBTIPO = 'BMG'  
    AND CL.NO_CLIENTE = 8611
    Merci d avance !

  2. #2
    Membre très actif Avatar de hazamor
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2008
    Messages : 179
    Par défaut
    Essayer avec ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT  DISTINCT  P.NO_PEDIDO PEDIDO, POR_RECIBIR.Nombre ...
    
    FROM  CLIENTES_CONTRATOS@TUCA CC , (SELECT  COUNT(*) Nombre FROM TARJETAS@TUCA TJ  
    WHERE  NNUM_PEDIDO_ORIGEN = NO_PEDIDO) As POR_RECIBIR
    
    WHERE CC.NO_CONTRATO = P.CC_NO_CONTRATO

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2004
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 80
    Par défaut
    Mmmm. Ca ne marche pas.
    Il bloque sur le AS, il me dit "SQL command not properly ended"
    Je suis pas tres fort en SQL, moi je n arrive pas a la faire marcher.
    Merci pour ton aide !

  4. #4
    Membre averti
    Inscrit en
    Juin 2003
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 25
    Par défaut
    Citation Envoyé par xoco Voir le message
    Mmmm. Ca ne marche pas.
    Il bloque sur le AS, il me dit "SQL command not properly ended"
    Je suis pas tres fort en SQL, moi je n arrive pas a la faire marcher.
    Merci pour ton aide !
    Je me suis fais avoir hier de la même manière:
    le mot-clé "as" ne peut être utilisé que dans le select, pas dans le from.

    La correction est donc simplement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT  DISTINCT  P.NO_PEDIDO PEDIDO, POR_RECIBIR.Nombre ...
     
    FROM  CLIENTES_CONTRATOS@TUCA CC , (SELECT  COUNT(*) Nombre FROM TARJETAS@TUCA TJ  
    WHERE  NNUM_PEDIDO_ORIGEN = NO_PEDIDO) POR_RECIBIR
     
    WHERE CC.NO_CONTRATO = P.CC_NO_CONTRATO
    Quant à la solution du problème d'origine, moi, je reproduis le champ construit dans la clause where. C'est pas beau, mais ça fonctionne. C'est vrai que la jointure est plus propre, mais sans la possibilité de faire des jointures en cascade, c'est difficile à mettre en oeuvre dans de requêtes compliquées.

  5. #5
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Décortiquons un peu ce galimatias !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    AND TJ.VTB_CVE_BAJA IS NULL  
    		AND (TJ.VTB_CVE_BAJA IS NOT NULL OR TJ.VTB_CVE_BAJA IS NULL )
    Faudrait savoir !
    TJ.VTB_CVE_BAJA doit être NULL ou pas ?
    La deuxième ligne ne sert à rien !

    Ensuite écrivons ça avec des jointures normalisées parce qu'actuellement c'est illisible. J'ajoute AS pour les alias parce que comme les noms de colonnes sont dans une langue inconnue pour moi j'ai du mal à faire la distinction entre les différents éléments :
    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
    30
    31
    SELECT  DISTINCT P.NO_PEDIDO AS PEDIDO, 
    	PR.DESCRIPCION AS PRODUCTO,  
    	PR.CVE_PRODUCTO CVEPRODUCTO,  
    	(
    		SELECT COUNT(*)  
    		FROM TARJETAS@TUCA AS TJ  
    		WHERE TJ.FECHA_BAJA IS NULL  
    			AND TJ.VTB_CVE_BAJA IS NULL  
    			AND 
    			(
    				TJ.par_ped_no_pedido = P.NO_PEDIDO  
    				OR TJ.PAR_PED_NO_PEDIDO IN 
    				(
    					SELECT NNUM_PEDIDO_SUST  
    					FROM SET_DEXTRAVIO_PEDIDOS@tuca  
    					WHERE NNUM_PEDIDO_ORIGEN = P.NO_PEDIDO
    				)
    			)
    	) AS POR_RECIBIR,  
    	P.CC_NO_CONTRATO AS CONTRATO  
    FROM  CLIENTES_CONTRATOS@TUCA AS CC
    INNER JOIN PEDIDOS@TUCA AS P ON CC.NO_CONTRATO = P.CC_NO_CONTRATO
    INNER JOIN PRODUCTOS@TUCA AS PR ON CC.PRD_CVE_PRODUCTO = PR.CVE_PRODUCTO
    INNER JOIN VIEW_TIPOS_PEDIDOS@TUCA AS VTP ON P.ESPECIAL = VTP.CVE_TIPO
    	INNER JOIN TIPOS_PEDIDOS_PRODUCTOS@TUCA AS TPP ON VTP.CVE_TIPO = TPP.VTP_CVE_TIPO
    INNER JOIN CLIENTES@TUCA AS CL ON CC.CLI_NO_CLIENTE = CL.NO_CLIENTE
    WHERE PR.CVE_PRODUCTO <> 23
    	AND P.ESPECIAL = 'STJ'  
    	AND P.RECEP_TARJ_CTE = 'S'  
    	AND TPP.CVE_SUBTIPO = 'BMG'  
    	AND CL.NO_CLIENTE = 8611
    Quant au problème posé, POR_RECIBIR correspond à la sous-requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT COUNT(*)  
    		FROM TARJETAS@TUCA AS TJ  
    		WHERE TJ.FECHA_BAJA IS NULL  
    			AND TJ.VTB_CVE_BAJA IS NULL  
    			AND 
    			(
    				TJ.par_ped_no_pedido = P.NO_PEDIDO  
    				OR TJ.PAR_PED_NO_PEDIDO IN 
    				(
    					SELECT NNUM_PEDIDO_SUST  
    					FROM SET_DEXTRAVIO_PEDIDOS@tuca  
    					WHERE NNUM_PEDIDO_ORIGEN = P.NO_PEDIDO
    				)
    			)
    Il s'agit d'un COUNT(*) donc la restriction que vous souhaitez mettre devrait fonctionner !

    Ceci dit sans préjuger du sens de la requête puisque je ne connais ni ce que vous voulez obtenir comme résultat, ni votre modèle de données.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  6. #6
    Membre confirmé
    Inscrit en
    Juin 2004
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 80
    Par défaut
    Merci pour ta reponse, CinePhil,
    Effectivement, il vaudrait mieux passer par des jointures, cela dit, je modifie un projet, donc je touche le moins possible.
    Alors si ca ne devrait pas me poser de pb, comment faire ?

    Dans mes clauses WHERE, je fais un AND POR_RECIBIR >0 mais il me dit qu il ne trouve pas la colonne POR_RECIBIR.
    Je ne sais pas contourner le pb.
    Mon pb est la.
    Merci pour ta reponse !

  7. #7
    Membre confirmé
    Inscrit en
    Juin 2004
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 80
    Par défaut
    Bon, je viens de voir que je travaille sous oracle 8i, et que le inner join n est disponible que sous >=9....
    C pour cela que je ne peux pas passer le inner join

  8. #8
    Invité
    Invité(e)
    Par défaut
    C'est pourquoi il est toujours demandé de fournir ses versions de travail

Discussions similaires

  1. requête condition sur plusieurs champs
    Par grinder59 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 23/02/2007, 13h52
  2. Vue et condition sur un champs
    Par Andry dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 10/11/2006, 09h12
  3. [Debutant] condition sur les champs
    Par nadhem dans le forum JDBC
    Réponses: 6
    Dernier message: 24/07/2006, 12h01
  4. condition sur un champ d'une table
    Par julio02200 dans le forum Access
    Réponses: 12
    Dernier message: 11/07/2006, 14h19
  5. Problème de requête avec cumul des conditions sur un champ
    Par UtopieAmbiante dans le forum Requêtes
    Réponses: 4
    Dernier message: 11/01/2006, 10h52

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