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

InterBase Discussion :

Requête union sur Interbase


Sujet :

InterBase

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 79
    Points : 66
    Points
    66
    Par défaut Requête union sur Interbase
    Bonjour,

    j'ai exécuté une requête union avec Interbase.
    J'utilise des abréviations pour définir le nom de mes tables.

    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
     
    SELECT 'VRAI' AS CONTENU, ADMFONC.IDFONCTION, ADMFONC.NOMFONCTION, ADMSOUSFONC.IDSOUSFONCTION, ADMSOUSFONC.NOMSOUSFONCTION
    FROM ADM_FONCTIONS ADMFONC
    LEFT JOIN ADM_SOUSFONCTIONS ADMSOUSFONC ON (ADMFONC.IDFONCTION = ADMSOUSFONC.IDFONCTION)
    LEFT JOIN ADM_FORMULAIRESFONCTIONS ADMFORMFONC ON (ADMSOUSFONC.IDSOUSFONCTION = ADMFORMFONC.IDSOUSFONCTION)
    LEFT JOIN ADM_FORMULAIRES ADMFORM ON (ADMFORMFONC.IDFORMULAIRE = ADMFORM.IDFORMULAIRE)
    WHERE IDFORMULAIRE = 1
    UNION
    SELECT 'FAUX' AS CONTENU, ADMFONC.IDFONCTION, ADMFONC.NOMFONCTION, ADMSOUSFONC.IDSOUSFONCTION, ADMSOUSFONC.NOMSOUSFONCTION
    FROM ADM_FONCTIONS ADMFONC
    LEFT JOIN ADM_SOUSFONCTIONS ADMSOUSFONC ON (ADMFONC.IDFONCTION = ADMSOUSFONC.IDFONCTION)
    WHERE IDSOUSFONCTION NOT IN (
    SELECT ADMSOUSFONC.IDSOUSFONCTION
    FROM ADM_FONCTIONS ADMFONC
    LEFT JOIN ADM_SOUSFONCTIONS ADMSOUSFONC ON (ADMFONC.IDFONCTION = ADMSOUSFONC.IDFONCTION)
    LEFT JOIN ADM_FORMULAIRESFONCTIONS ADMFORMFONC ON (ADMSOUSFONC.IDSOUSFONCTION = ADMFORMFONC.IDSOUSFONCTION)
    LEFT JOIN ADM_FORMULAIRES ADMFORM ON (ADMFORMFONC.IDFORMULAIRE = ADMFORM.IDFORMULAIRE)
    WHERE IDFORMULAIRE = 1)
    Le problème est que j'ai une erreur parce que l'abréviation ADMFONC est utilisée dans les deux requêtes.
    En mettant deux abbréviations différentes, ça passe...

    J'ai le message d'erreur suivant :
    Dynamic SQL Error
    SQL error code = -204
    alias ADMFONC conflicts with an alias in the same statement
    Statement: SELECT 'VRAI' AS CONTENU, ADMFONC.IDFONCTION, ADMFONC.NOMFONCTION, ADMSOUSFONC.IDSOUSFONCTION, ADMSOUSFONC.NOMSOUSFONCTION
    FROM ADM_FONCTIONS ADMFONC
    LEFT JOIN ADM_SOUSFONCTIONS ADMSOUSFONC ON (ADMFONC.IDFONCTION = ADMSOUSFONC.IDFONCTION)
    LEFT JOIN ADM_FORMULAIRESFONCTIONS ADMFORMFONC ON (ADMSOUSFONC.IDSOUSFONCTION = ADMFORMFONC.IDSOUSFONCTION)
    LEFT JOIN ADM_FORMULAIRES ADMFORM ON (ADMFORMFONC.IDFORMULAIRE = ADMFORM.IDFORMULAIRE)
    WHERE IDFORMULAIRE = 1
    UNION
    SELECT 'FAUX' AS CONTENU, ADMFONC.IDFONCTION, ADMFONC.NOMFONCTION, ADMSOUSFONC.IDSOUSFONCTION, ADMSOUSFONC.NOMSOUSFONCTION
    FROM ADM_FONCTIONS ADMFONC
    LEFT JOIN ADM_SOUSFONCTIONS ADMSOUSFONC ON (ADMFONC.IDFONCTION = ADMSOUSFONC.IDFONCTION)
    WHERE IDSOUSFONCTION NOT IN (
    SELECT ADMSOUSFONC.IDSOUSFONCTION
    FROM ADM_FONCTIONS ADMFONC
    LEFT JOIN ADM_SOUSFONCTIONS ADMSOUSFONC ON (ADMFONC.IDFONCTION = ADMSOUSFONC.IDFONCTION)
    LEFT JOIN ADM_FORMULAIRESFONCTIONS ADMFORMFONC ON (ADMSOUSFONC.IDSOUSFONCTION = ADMFORMFONC.IDSOUSFONCTION)
    LEFT JOIN ADM_FORMULAIRES ADMFORM ON (ADMFORMFONC.IDFORMULAIRE = ADMFORM.IDFORMULAIRE)
    WHERE IDFORMULAIRE = 1)
    Merci pour votre aide,

    Alexandre.

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Le message est (probablement) dû au fait que tu crées une confusion en utilisant 2 fois le même alias ADMFONC entre une requête principale et sa sous-requête (je parle de la 2ème partie de ta requête UNION) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ...UNION 
    SELECT ... 
    FROM ADM_FONCTIONS ADMFONC 
    ...
    WHERE IDSOUSFONCTION NOT IN ( 
    SELECT ...
    FROM ADM_FONCTIONS ADMFONC // confusion introduite par cet alias !!!!
    ...)
    Modérateur des forums Oracle et Langage SQL
    Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 79
    Points : 66
    Points
    66
    Par défaut
    Je pensais en fait que comme il sagissait d'une sous requête, le moteur de base de données exécutait d'abord la sous requête, puis la requête principale. Je pensais alors qu'il n'y aurait pas de confusion avec les abbréviations.

    Merci pour ton aide.

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

Discussions similaires

  1. [AC-2010] Requête UNION sur tables attachées -- Problème ODBC
    Par PetitChris dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 26/03/2015, 12h05
  2. requête UNION sur deux tables
    Par cotede2 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 22/05/2009, 11h57
  3. Requête Union sur 3 tables
    Par Nounours1 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 18/11/2007, 15h08
  4. [Optimisation] Problème sur une requête UNION.
    Par françois62 dans le forum Requêtes
    Réponses: 5
    Dernier message: 28/06/2005, 17h08
  5. Requête UNION sous Interbase 6 ...
    Par Djedjeridoo dans le forum InterBase
    Réponses: 2
    Dernier message: 27/07/2004, 10h08

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