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

Sybase Discussion :

Problème jointure croisée et tables dérivées - Toujours pas résolu :o(


Sujet :

Sybase

  1. #1
    Membre régulier
    Profil pro
    Développeur Web
    Inscrit en
    Décembre 2005
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2005
    Messages : 110
    Points : 77
    Points
    77
    Par défaut Problème jointure croisée et tables dérivées - Toujours pas résolu :o(
    Bonjour

    Avant toute chose : j'utilise ASE version 15.0.
    Voilà ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    select table2.id_colonnes, id_types, id_vues, colonnes_nom, colonnes_champ_cible,
    	colonnes_ordre, colonnes_config_type, colonnes_liste, colonnes_triable,
    	colonnes_editable, colonnes_cherchable, colonnes_tag, types_nom
    from (select * from (select sc.*, st.types_nom from shadow_colonnes sc inner join shadow_types st on sc.id_types=st.id_types) table1) table2, shadow_roles sr
    left outer join shadow_droits_colonnes sdc on (table2.id_colonnes=sdc.id_colonnes and sr.id_roles=sdc.id_roles)
    where table2.id_vues=87
    and sr.id_roles in (72,73)
    and sdc.droits_collonnes_modif <> 0;
    Et voilà mon erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Adaptive Server cannot perform the requested action because column 'id_colonnes' is not within the scope of the joined table expression. Check your command
    for missing or incorrect database objects, variable names, and/or input data.
    Cette erreur concerne cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    left outer join shadow_droits_colonnes sdc on (table2.id_colonnes=sdc.id_colonnes and sr.id_roles=sdc.id_roles)
    Comment puis-je modifier ma requête pour que id_colonnes soit reconnue ?

    Une autre question, cette requête est-elle portable ou bien est-ce une syntaxe propre à Sybase (il semblerait que Sybase ne reconnaisse pas les alias si ceux-ci sont "appelés" en dehors des parenthèses dans lesquels ils sont déclarés...)

    Merci d'avance

  2. #2
    Membre régulier
    Profil pro
    Développeur Web
    Inscrit en
    Décembre 2005
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2005
    Messages : 110
    Points : 77
    Points
    77
    Par défaut
    J'ai trouvé cette requête qui a l'air de fonctionner :

    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 table3.id_colonnes, id_types, id_vues, colonnes_nom, colonnes_champ_cible,
    	colonnes_ordre, colonnes_config_type, colonnes_liste, colonnes_triable,
    	colonnes_editable, colonnes_cherchable, colonnes_tag, types_nom
    from (
    	select * from (
    		select sc.*, st.types_nom from shadow_colonnes sc inner join shadow_types st on sc.id_types=st.id_types) 
    	table2, shadow_roles sr)
    table3
     
    left outer join shadow_droits_colonnes sdc on (table3.id_colonnes=sdc.id_colonnes and table3.id_roles=sdc.id_roles)
    where table3.id_vues=87
    and table3.id_roles in (72,73)
    and sdc.droits_collonnes_modif <> 0;
    Mais je me pose toujours la question de la portabilité de cette requête...

    Merci d'avance si vous avez la réponse à ma question

  3. #3
    Membre régulier
    Profil pro
    Développeur Web
    Inscrit en
    Décembre 2005
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2005
    Messages : 110
    Points : 77
    Points
    77
    Par défaut Nouveau souci
    J'ai un nouveau souci avec cette requête, et plus particulièrement avec ce morceau là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select table3.id_colonnes, sdc.id_roles, sdc.droits_collonnes_voir
    from (
    	select * from (
    		select sc.*, st.types_nom from shadow_colonnes sc inner join shadow_types st on sc.id_types=st.id_types) 
    	table2, shadow_roles sr)
    table3
    left outer join shadow_droits_colonnes sdc on (table3.id_colonnes = sdc.id_colonnes and table3.id_roles = sdc.id_roles)
    Je fais une jointure croisée, et donc lorsqu'il n'y a pas de valeur commune aux 2 tables (plus précisément, mon alias "table3" et ma table "shadow_droits_colonnes"), le tuple doit quand même apparaître mais avec un 'null' à la place de la valeur qui n'est pas en commun dans les 2 tables.
    Mon problème est qu'au lieu de me renvoyer null, ça me renvoit false (0) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    id_colonnes id_roles droits_collonnes_voir
     ----------- -------- ---------------------
              86       72                     1
              86       73                     1
              87       72                     0
              87     NULL                     0
              88       72                     0
              88     NULL                     0
              89     NULL                     0
              89     NULL                     0
    Là où il y a null dans 'id_roles', je devrais aussi avoir null dans 'droits_collones_voir'.
    Je me demande si ce n'est pas parce que le champ concerné est de type 'bit', et qu'une valeur null y est interdite.

    Merci pour votre aide Ne me laissez pas sans réponse !

  4. #4
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut attention au NULL
    Attention, il faut bien avoir à l'esprit que NULL signifie "INCONNU" ou "sans objet", ce n'est pas une valeur, mais l'absence de valeur. C'est un peu comme les "ne se prononce pas" dans les sondages... Donc lorsqu'on demande à une base de donnée de comparer une colonne de valeur inconnue à une autre colonne de valeur inconnue, cette dernière ne peux pas répondre... la réponse exacte devrait être "JE SAIS PAS" ou "PTET BEN QU'OUI, PTET BEN QU'NON" mais ce genre de réponse n'étant pas prévue, elle répond systématiquement "NON".

    Ca peut paraitre paradoxal mais (NULL = NULL) répond FAUX, (NULL <> NULL) répond FAUX aussi, en fait dés qu'il y a NULL dans une comparaison, la réponse est systématiquement négative sauf à la question "isnull".

    C'est pour ça que toutes les lignes ayant null dans une colonne de jointure seront rejetées....

  5. #5
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 220
    Points : 19 549
    Points
    19 549
    Billets dans le blog
    25
    Par défaut
    Citation Envoyé par remi4444
    Attention, il faut bien avoir à l'esprit que NULL signifie "INCONNU" ou "sans objet", ce n'est pas une valeur, mais l'absence de valeur. C'est un peu comme les "ne se prononce pas" dans les sondages... Donc lorsqu'on demande à une base de donnée de comparer une colonne de valeur inconnue à une autre colonne de valeur inconnue, cette dernière ne peux pas répondre... la réponse exacte devrait être "JE SAIS PAS" ou "PTET BEN QU'OUI, PTET BEN QU'NON" mais ce genre de réponse n'étant pas prévue, elle répond systématiquement "NON".

    Ca peut paraitre paradoxal mais (NULL = NULL) répond FAUX, (NULL <> NULL) répond FAUX aussi, en fait dés qu'il y a NULL dans une comparaison, la réponse est systématiquement négative sauf à la question "isnull".

    C'est pour ça que toutes les lignes ayant null dans une colonne de jointure seront rejetées....
    Inexact sous Sybase, bien que l'explication du NULL me plaise

    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
    42
    43
    44
    45
    46
    47
    48
    1> create table t(i int, v varchar(30) NULL)
    2> go
     
    1> insert into t values(1,'abc')
    2> insert into t values(2,null)
    3> go
    (1 row affected)
    (1 row affected)
     
    1> select * from t
    2> go
     i           v
     ----------- ------------------------------
               1 abc
               2 NULL
     
    (2 rows affected)
     
    1> select * from t where v=NULL
    2> go
     i           v
     ----------- ------------------------------
               2 NULL
     
    (1 row affected)
     
    1> select * from t where v<>NULL
    2> go
     i           v
     ----------- ------------------------------
               1 abc
     
    (1 row affected)
     
    1> select count(*) from t
    2> go
     
     -----------
               2
     
    (1 row affected)
    1> select count(v) from t -- compte les valeurs non null
    2> go
     
     -----------
               1
     
    (1 row affected)
    Sous Oracle et MS-SQL par contre, comportement comme spécifié

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SQL> select * from t where v = null ;
     
    aucune ligne sélectionnée
     
    SQL> select * from t where v <> null ;
     
    aucune ligne sélectionnée
    Sous DB2, la syntaxe n'est pas acceptée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select * from t where v = null 
     
     Utilisation de NULL incorrecte.
    idem sous Informix

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select * from t where v = null 
     
      217: Column (null) not found in any table in the query (or SLV is undefined)
    Sr DBA Oracle / MS-SQL / MySQL / Postgresql / SAP-Sybase / Informix / DB2

    N'oublie pas de consulter mes articles, mon blog, les cours et les FAQ SGBD

    Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !

  6. #6
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut Certes...
    Oui j'ai un peu résumé, il est vrai que sybase a cette tolérance de faire l'équivalence entre "isnull" et "=NULL" ce qui est lamentable à mon avis, puisque ça mène justement à la confusion que je dénonçait plus haut.

    Mais attention, cette tolérance disparait dans les jointures!!

    La preuve:

    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
     
     
    1> create table t(i int, v varchar(30) NULL)
    2> go
     
    1> insert into t values(1,'abc')
    2> insert into t values(2,null)
    3> go
     
    1> select T1.*,T2.* from t T1, t T2 where T1.v = T2.v
    2> go
     
    i           v                              i           v                              
    ----------- -                              ----------- -                              
              1 abc                                      1 abc    
     
    (1 row affected)
    Etonnant non ?

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 307
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 307
    Points : 1 828
    Points
    1 828
    Par défaut
    A tout ceci il faut ajouter que le comportement des valeurs NULL peut être modifié via l'option ANSI_NULL (p.ex. SET ANSI_NULL ON). Si cette option est positioné alors les égalités avec NULL ne sont pas tolérées.

    Michael
    Michael Peppler
    Membre de TeamSybase - www.teamsybase.com

    "A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson

Discussions similaires

  1. Réponses: 2
    Dernier message: 23/06/2010, 09h13
  2. Problème - jointure de 2 tables ..
    Par zouzou_18 dans le forum VB.NET
    Réponses: 7
    Dernier message: 03/08/2009, 18h00
  3. [SQL] requête analyse croisée comme table dérivée
    Par tinomulot dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 22/09/2008, 10h40
  4. Problème jointure de deux tables.
    Par Chasseur d'étoiles dans le forum Requêtes
    Réponses: 8
    Dernier message: 12/07/2008, 01h25
  5. [BO 6.5] Jointure complexe et tables dérivées
    Par tegestobis dans le forum Designer
    Réponses: 9
    Dernier message: 09/01/2008, 15h21

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