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

Langage SQL Discussion :

Création d'une vue avec un case


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 7
    Points : 2
    Points
    2
    Par défaut Création d'une vue avec un case
    Bonjour,

    Je dois créer une vue, avec pour certains champs des "case" dépendant des valeurs d'autres champs. En gros :
    Par exemple :
    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
    CREATE OR REPLACE VIEW "maVue" ("ID_RTN","TYPE_RTN")
         AS (SELECT
    	-- 1 -- ID_RTN
    	(select ...)  as ID_RTN,
    	-- 2 -- TYPE_RTN
    	(SELECT case when 
    		ID_RTN = 1
    	then
    		'A'
    	else 
    		NULL
    	end FROM dual) as TYPE_RTN
    FROM
    	maTable
    WHERE 
    	{autres conditions)
    mais là j'ai l'erreur
    SQL Error: ORA-00904: "ID_RTN": invalid identifier
    00904. 00000 - "%s: invalid identifier"
    Puisqu'il ne connait pas (encore) cet alias de colonne, j'ai voulu lui redonner tout le select qui permet de remplir cette colonne...
    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
    CREATE OR REPLACE VIEW "maVue" ("ID_RTN","TYPE_RTN")
         AS (SELECT
    	-- 1 -- ID_RTN
    	(select ...)  as ID_RTN,
    	-- 2 -- TYPE_RTN
    	(SELECT case when 
    		(select ...) = 1
    	then
    		'A'
    	else 
    		NULL
    	end FROM dual) as TYPE_RTN
    FROM
    	maTable
    WHERE 
    	{autres conditions)
    mais là non plus : le select peut me renvoyer plusieurs lignes, je n'ai pas de moyen de lui préciser que je veux "la valeur du champ pour la ligne correspondant à celle sur laquelle on est déjà" (si vous me dites que c'est pas clair, je ne me vexerai pas...).

    Il y a-t-il une solution ?! J'aurais aimé ne pas avoir à passer par une procédure stockée...

  2. #2
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    Je tente ma chance : pas de parenthèse après le
    CREATE VIEW xxx AS

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par pacmann Voir le message
    Salut !

    Je tente ma chance : pas de parenthèse après le
    CREATE VIEW xxx AS
    Hééénon, ça marche sans mais ça gênait pas - mais merci hein

  4. #4
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Hmmm, zut !

    Bon par contre, tu ne peux pas réutiliser dans le select, "id_rtn" que tu définis dans le même select ! Il faut te retaper tout la formule pour y faire référence... ou alors utiliser un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    create view ... as with t as (...) select * from ..
    (pour commencer par définir tes trucs avant de les réutiliser. Tu vois ce que je veux dire ?)

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par pacmann Voir le message
    Hmmm, zut !
    Bon par contre, tu ne peux pas réutiliser dans le select, "id_rtn" que tu définis dans le même select ! Il faut te retaper tout la formule pour y faire référence... ou alors utiliser un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    create view ... as with t as (...) select * from ..
    (pour commencer par définir tes trucs avant de les réutiliser. Tu vois ce que je veux dire ?)
    Alors je crois que je vois mais que je retape tout le biniou ou que je définisse mon "id_rtn" avant, j'ai toujours le souci que le biniou sort plusieurs lignes et qu'il ne comprend pas que c'est la même ligne qu'il faut qu'il regarde.
    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
    CREATE OR REPLACE VIEW "maVue" ("ID_RTN","TYPE_RTN")
         AS (SELECT
    	-- 1 -- ID_RTN
    	(SELECT ...)  AS ID_RTN,
    	-- 2 -- TYPE_RTN
    	(SELECT case when 
    		(SELECT ...) = 1
    	then
    		'A'
    	else 
    		NULL
    	end FROM dual) AS TYPE_RTN
    FROM
    	maTable
    WHERE 
    	{autres conditions)
    Si mon biniou bleu me sort 3 lignes...

    euh

    en fait finalement je n'ai plus besoin du select en question du coup mon problème ne se pose plus... donc on saura jamais
    Désolée et merci hein...

  6. #6
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Citation Envoyé par Pauline65 Voir le message
    Si mon biniou bleu me sort 3 lignes...
    C'est un problème en soi, quelle que soit la manière de l'implémenter !

    Attends, laisse moi deviner ce qui va se passer... Oracle, Oracle, dis-moi l'avenir :

    ORA-01427 : single-row subquery returns more than one row

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par pacmann Voir le message
    C'est un problème en soi, quelle que soit la manière de l'implémenter !

    Attends, laisse moi deviner ce qui va se passer... Oracle, Oracle, dis-moi l'avenir :

    Hé oui.
    Et si j'ai pu esquiver pour ma première vue, là je suis bien obligée de m'y mettre
    Mais
    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
    CREATE OR REPLACE VIEW "maVue" (ID_RTN,TYPE_RTN)
          AS (WITH SN as (select ... ) 
           SELECT
    	-- 1 -- ID_RTN
    	(SELECT )  AS ID_RTN,
    	-- 2 -- TYPE_RTN
    	(SELECT case when 
    		(SELECT qui utilise SN... ) = 1
    	then 'A'
    	else 	NULL
    	end FROM dual) AS TYPE_RTN
    FROM
    	maTable
    WHERE 
    	{autres conditions)
    Malheureusement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Error at Command Line:322 Column:59
    Error report:
    SQL Error: ORA-32034: unsupported use of WITH clause
    32034. 00000 -  "unsupported use of WITH clause"
    *Cause:    Inproper use of WITH clause because one of the following two reasons
               1. nesting of WITH clause within WITH clause not supported yet
               2. For a set query, WITH clause can't be specified for a branch.
               3. WITH clause can't sepecified within parentheses.
    *Action:   correct query and retry
    Si ce sont mes parentheses qui le gènent, je vois pas bien ce que je peux faire

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 391
    Points
    18 391
    Par défaut
    Vous serait-il possible de mettre toute la partie du select de votre requête, là ce n'est pas très simple de vous aider efficacement !

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    oups, oui :
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
      CREATE OR REPLACE  VIEW 
    	"VW_SNAG_FT_AC" 
    	("SNAG_NUMBER",
    	"ATA")  AS ( SELECT
    	-- SNAG_NUMBER
    	SN_SNAG_ISSUE.SNAG_NUMBER as SNAG_NUMBER,
    	-- ATA_CHAPTER
    	(SELECT ATA_CHAPTER.ATA_CHAPTER
    	FROM SN_SNAG_ISSUE, ATA_CHAPTER
    	WHERE SN_SNAG_ISSUE.ATA_CHAPTER_LAST_ID=ATA_CHAPTER.ID
    	AND SN_SNAG_ISSUE.SNAG_NUMBER =SNAG_NUMBER) as ATA_CHAPTER
    FROM
    	SN_SNAG_ISSUE,
    	FT_FLIGHT,
    	AC_AIRCRAFT,
    	AC_TYPE,
    	AC_PROGRAM,
    	ATA_CHAPTER
    WHERE 
    	-- Miltary programs are not selected  
    	SN_SNAG_ISSUE.FT_FLIGHT_ID=FT_FLIGHT.ID
    	AND FT_FLIGHT.AC_AIRCRAFT_ID=AC_AIRCRAFT.ID
    	AND AC_AIRCRAFT.AC_TYPE_ID=AC_TYPE.ID
    	AND AC_TYPE.AC_PROGRAM_ID=AC_PROGRAM.ID
    	AND AC_PROGRAM.AC_PROGRAM != 'M'
    	-- Snags where last Status for department 'EVT' is 'DELETED' are nor selected
    	AND  
    	(SELECT SN_SNAG_STATUS.SNAG_STATUS_TITLE 
    	FROM SN_SNAG_ISSUE_STATUS, SN_SNAG_STATUS, SN_SNAG_ISSUE, SN_DEPARTMENT
    	WHERE SN_SNAG_ISSUE_STATUS.SN_SNAG_STATUS_ID=SN_SNAG_STATUS.ID
    	AND SN_SNAG_ISSUE_STATUS.SN_SNAG_ISSUE_ID=SN_SNAG_ISSUE.ID
    	AND SN_SNAG_ISSUE_STATUS.SN_DEPARTMENT_ID=SN_DEPARTMENT.ID
    	AND SN_DEPARTMENT.DEPARTMENT='EVT'
    	AND SN_SNAG_ISSUE_STATUS.SNAG_STATUS_DATE = (SELECT max(SN_SNAG_ISSUE_STATUS.SNAG_STATUS_DATE)
    			FROM SN_SNAG_ISSUE_STATUS, SN_SNAG_STATUS, SN_SNAG_ISSUE, SN_DEPARTMENT
    			WHERE SN_SNAG_ISSUE_STATUS.SN_SNAG_STATUS_ID=SN_SNAG_STATUS.ID
    			AND SN_SNAG_ISSUE_STATUS.SN_SNAG_ISSUE_ID=SN_SNAG_ISSUE.ID
    			AND SN_SNAG_ISSUE_STATUS.SN_DEPARTMENT_ID=SN_DEPARTMENT.ID
    			AND SN_DEPARTMENT.DEPARTMENT='EVT'))  != 'DELETED' 
    
    );
    ...et donc, il ne comprend pas ce qu'est "SNAG_NUMBER" dans ma sous-requête. J'ai essayé de glisser un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WITH SNAG_NUMBER as (select SN_SNAG_ISSUE.SNAG_NUMBER from SN_SNAG_ISSUE )
    à plusieurs endroits mais soit j'ai l'erreur donnée plus haut (qui dit "pas de With dans des parenthèses, etc), soit il me reproche une erreur de syntaxe.

  10. #10
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    Dans la sous-requête à l'intérieur de ton SELECT, SNAG_NUMBER est utilisé dans deux context différents.

    Je pense qu'il faut que tu aliases ta table SN_SNAG_ISSUE dans les deux morceaux de requête (par exemple par "a" et "b"), puis que tu précises a.SN_SNAG_ISSUE = b.SN_SNAG_ISSUE ?

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    ...effectivement, ça marche beaucoup mieux !

    (réponse tardive parce que j'avais laissé la table 'ATA_CHAPTER' en trop dans le FROM, et il m'a fallu un sacré paquet de temps pour trouver d'où venait ce produit cartésien impromptu : la "vraie" requête fait 300 lignes)

    Merci merci merci !

  12. #12
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 111
    Points : 28 459
    Points
    28 459
    Par défaut
    D'où l'utilité d'exprimer ses jointures de manière normalisée (INNER JOIN table ON condition) qui met immédiatement en évidence les produits cartésiens

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    D'où l'utilité d'exprimer ses jointures de manière normalisée (INNER JOIN table ON condition) qui met immédiatement en évidence les produits cartésiens
    ah !
    En fait je n'avais pas appris de cette manière et comme je n'ai fait que trèstrès peu de SQL depuis la fin de mes études (au cas où ça ne se serait pas vu... ), les quelques fois où j'ai vu cette façon de faire, ça m'a pas mal embrouillée.
    Mais effectivement, ça vaut le coup de me pencher sur la question

    Encore merci !

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

Discussions similaires

  1. [AC-2013] Création d'une liste avec cases à cocher
    Par boroti dans le forum Modélisation
    Réponses: 2
    Dernier message: 17/06/2015, 17h27
  2. Réponses: 8
    Dernier message: 10/12/2007, 16h27
  3. ORACLE 9.2 : Création d'une vue avec plusieurs clauses WHERE
    Par soffinette dans le forum Administration
    Réponses: 4
    Dernier message: 01/02/2007, 10h51
  4. Création d'une base avec IbConsole
    Par Lucien dans le forum Outils
    Réponses: 3
    Dernier message: 02/03/2004, 18h34
  5. Export d'une vue avec LEFT JOIN
    Par schnourf dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 22/05/2003, 13h57

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