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 Firebird Discussion :

Différence entre '=' et 'not <>'


Sujet :

SQL Firebird

  1. #1
    Nouveau membre du Club
    Inscrit en
    Août 2003
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 34
    Points : 32
    Points
    32
    Par défaut Différence entre '=' et 'not <>'
    Bonjour,

    Voilà, j'ai un problème depuis 2 jours.
    La première requete ne marche pas (erreur : no current record for fetch operation) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT  *
    FROM    table1  LEFT OUTER JOIN table2  ON table1.champ1 = table2.champ_cle1,
            table3    LEFT OUTER JOIN table4  ON table3.champ1 = table4.champ_cle1
    WHERE ( table1.champ2 = table3.champ1 )

    La seconde requete marche super:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT  *
    FROM    table1  LEFT OUTER JOIN table2  ON table1.champ1 = table2.champ_cle1,
            table3    LEFT OUTER JOIN table4  ON table3.champ1 = table4.champ_cle1
    WHERE not ( table1.champ2 <> table3.champ1 )

    LA DIFFERENCE EST DANS LE WHERE :
    '=' DEVIENT 'not <>'

    Merci de votre réponse si vous en avez une ou du moins une piste.

  2. #2
    Membre confirmé
    Avatar de Etienne Bar
    Homme Profil pro
    Consultant indépendant
    Inscrit en
    Octobre 2002
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Consultant indépendant
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2002
    Messages : 282
    Points : 593
    Points
    593
    Par défaut
    Alors une piste, peut être :

    Un problème lié à la présence de null, peut être ?

    En effet , (NULL = NULL) <=> Faux !
    DRH Canal Historique
    Informaticien Indépendant
    http://www.etiennebar.com

  3. #3
    Nouveau membre du Club
    Inscrit en
    Août 2003
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 34
    Points : 32
    Points
    32
    Par défaut
    Bonjour et merci de ta réponse le vieux,

    le problème est que dans le cas actuel, il y a bien des données qui se correspondent dans mes tables TABLE1 et TABLE3 anisi que TABLE3 et TABLE4.

    Ca aurait pu être ça mais dommage, bien tenté.

  4. #4
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Tu es certain que tes deux requetes sont identiques mis à part le where not <> et = ?

    Car normalement il ne devrait y avoir aucunne différences. Tu peux même le vérifier sur des requetes plus simples.

    D'ailleurs tu devrais tester :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT  * 
    FROM    table1, table3 
    WHERE ( table1.champ2 = table3.champ1 )
    revient à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT  * 
    FROM    table1, table3 
    WHERE not ( table1.champ2 <> table3.champ1 )
    Qui revient exactement au même car les jointures que tu utilisent ne retirent pas de lignes à ta selection vue que ce sont des jointures gauches. Il te manquera juste des colonnes (celle de la table2 et table4).

  5. #5
    Nouveau membre du Club
    Inscrit en
    Août 2003
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 34
    Points : 32
    Points
    32
    Par défaut
    Oui, mes requetes sont identiques (créées avec un bon vieux copiés/collé)

    Je soupçonne que quand on fait un 'not <>', on passe par une table temporaire et que du coup, Interbase gère mieux.

    Au fait, je fait un changement de données pour un logiciel et la requete avec le '=' passe très bien avec SQLANYWHERE 6 de SYBASE.

    Merci de t'être penché sur la question mais c'est encore raté.

  6. #6
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Peux tu à ce moment là nous donner les ordres créate de tes tables,
    et éventuellement les données et les deux ordres SQL.

    Car chez moi après quelques tests, le résultat entre les deux ordres SQL est strictement identiques (et je ne vois pas du tout pour quoi ils seraient différents...)

  7. #7
    Nouveau membre du Club
    Inscrit en
    Août 2003
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 34
    Points : 32
    Points
    32
    Par défaut
    Voici les ordres de création en simplifiant au max:
    CREATE TABLE SERVICE (
    SER_CODE CHAR(5) NOT NULL,
    CALEN_CODE CHAR(10) DEFAULT NULL
    );
    ALTER TABLE SERVICE ADD PRIMARY KEY (SER_CODE);
    CREATE TABLE RISQUEAT (
    RAT_TYPE CHAR(5) NOT NULL,
    RAT_LIBELLE CHAR(80) DEFAULT NULL,
    );
    ALTER TABLE RISQUEAT ADD PRIMARY KEY (RAT_TYPE);
    CREATE TABLE PERSONNEL (
    PER_CODE CHAR(10) NOT NULL,
    SER_CODE CHAR(5) NOT NULL,
    RAT_TYPE CHAR(5)
    );
    ALTER TABLE PERSONNEL ADD PRIMARY KEY (PER_CODE);
    CREATE TABLE CALENTYPE (
    CALEN_CODE CHAR(10) NOT NULL,
    CALEN_INTITULE CHAR(80) DEFAULT NULL
    );
    ALTER TABLE CALENTYPE ADD PRIMARY KEY (CALEN_CODE);
    Puis les données :
    INSERT INTO SERVICE VALUES('ACC',NULL);
    INSERT INTO SERVICE VALUES('COM',NULL);

    INSERT INTO RISQUEAT VALUES('ATE','Atelier');
    INSERT INTO RISQUEAT VALUES('BUR','Bureau');

    INSERT INTO PERSONNEL VALUES('01','COM',NULL);
    La table CALENTYPE est vide.


    Les requètes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select *
    from    personnel  LEFT OUTER JOIN risqueat   ON personnel.rat_type = risqueat.rat_type, 
            service    LEFT OUTER JOIN calentype  ON service.calen_code = calentype.calen_code
    where personnel.per_code = '01'
    and   service.ser_code = personnel.ser_code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select *
    from    personnel  LEFT OUTER JOIN risqueat   ON personnel.rat_type = risqueat.rat_type, 
            service    LEFT OUTER JOIN calentype  ON service.calen_code = calentype.calen_code
    where personnel.per_code = '01'
    and   not (service.ser_code <> personnel.ser_code)
    Voilà.
    Merci à ceux qui prendront le temps d'étudier le problème.
    (indication peut être utile. Je travaille en INTERBASE 6.0 en dialect 3)

  8. #8
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Bon il y a en effet un bugg, qui à priori est du au filtrage sur une table issus du produit cartésien de deux jointures gauches.

    Mais à ce sujet pourquoi fais tu un produit cartésien ???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select *
    from    personnel  LEFT OUTER JOIN risqueat   ON (personnel.rat_type = risqueat.rat_type)
            inner join service on (service.ser_code = personnel.ser_code)
            LEFT OUTER JOIN calentype  ON (service.calen_code = calentype.calen_code)
    where personnel.per_code = '01'
    Cette requete serait plus adaptée il me semble....

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

Discussions similaires

  1. Différence entre un "bidouilleur" et un Pro ?
    Par christ_mallet dans le forum Débats sur le développement - Le Best Of
    Réponses: 290
    Dernier message: 28/11/2011, 10h53
  2. Réponses: 7
    Dernier message: 27/02/2008, 13h55
  3. Différence entre TCP, UDP, ICMP
    Par GliGli dans le forum Développement
    Réponses: 1
    Dernier message: 13/09/2002, 08h25
  4. Différences entre jmp, jz, jnz, etc
    Par christbilale dans le forum Assembleur
    Réponses: 3
    Dernier message: 05/07/2002, 15h09
  5. Réponses: 3
    Dernier message: 07/05/2002, 16h06

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