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 :

Jointure avec condition paramétrée


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juillet 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Juillet 2006
    Messages : 133
    Points : 90
    Points
    90
    Par défaut Jointure avec condition paramétrée
    Bonjour,

    J'ai une problématique de jointure sur une condition paramétré.
    Je m'explique :
    TABLE 1
    Id (numérique) | Alea (numérique)
    1 | 1
    2 |
    3 | 2
    4 | 5

    TABLE 2
    Nom | Valeur
    ALEA001 | Cas spécifique 1
    ALEA002 | Cas max
    ALEA003 | Cas min
    ALEA004 | Erreur

    Bref j'ai une requête de sélection sur table 1, et je voudrais faire une jointure sur table 2 entre les colonnes T1.Alea et T2.Alea.
    La jointure serait du type :T1 LEFT OUTER JOIN T2 ON T2.Nom = CONCAT("ALEA", LPAD(T1.Alea,3,'0'))

    Mais vous comprendrez que cette condition ne fonctionne pas.

    Si vous avez une solution, je prend

    Merci, !

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 099
    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 099
    Points : 28 400
    Points
    28 400
    Par défaut
    Et pourquoi ne fonctionne-t-elle pas ?
    On peut aussi le prendre dans l'autre sens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .. ON  t1.alea = CAST(SUBSTRING(t2.nom FROM 5) AS INTEGER)

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 300
    Points : 39 641
    Points
    39 641
    Billets dans le blog
    9
    Par défaut
    Et pourquoi avoir modélisé des colonnes de types et contenus différents qui imposent des jointures non sargables et compromettent les contrôles d'intégrité via les FK
    Allez tirer les oreilles du concepteur de la base de données !

  4. #4
    Membre régulier
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juillet 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Juillet 2006
    Messages : 133
    Points : 90
    Points
    90
    Par défaut
    Bonjour,

    Merci al1_24, ce code fonctionne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ON  t1.alea = CAST(SUBSTRING(t2.nom FROM 5) AS INTEGER)
    Mais une chose que je n'avais pas précisé, la table 2 ne contient pas obligatoire du alea :
    TABLE 2
    Nom | Valeur
    Blabla | ...
    CTPA001 | ....
    GRAS002 | ...
    ALEA001 | Cas spécifique 1
    ALEA002 | Cas max
    ALEA003 | Cas min
    ALEA004 | Erreur
    Ces autres valeur fausses donc le résultat ...

    De plus, la table 1 n'a pas obligatoirement un type d'alea :
    Id (numérique) | Alea (numérique)
    1 | 1
    2 |
    3 | 2
    4 | 5
    Le 2 n'a pas d'alea...

    escartefigue, hoooo oui, toute la structure de la base est mal foutu.
    Ils ont créé cette table T2 en mode bordel avec pleinnn de paramètres de configuration du logiciel.

    Merci pour votre aide, si vous avez une idée pour résoudre les 2 points du dessus,

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 300
    Points : 39 641
    Points
    39 641
    Billets dans le blog
    9
    Par défaut
    Bonjour

    Le principe d'une base de données relationnelle est contenu dans le titre : pouvoir établir des relations
    Or, pour ce faire, il y a un minimum : que les données dans les tables à mettre en relation aient des contenus qui puissent être comparés !

    Votre base de données ne respecte pas les minimums requis : format de données différents, contenus différents, exceptions...

    Adressez vous à votre fournisseur et demandez lui de construire une base digne de ce nom !

  6. #6
    Membre régulier
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juillet 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Juillet 2006
    Messages : 133
    Points : 90
    Points
    90
    Par défaut
    Merci pour votre retour.
    Je suis tout à fait d'accord avec vous.
    Malheureusement le logiciel qui fonctionne derrière est entièrement basé sur cette anarchie.
    Impossible donc de remettre en question toute la structure ...
    L'analyse que je souhaite faire doit donc se baser la dessus :S :S

  7. #7
    Membre régulier
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juillet 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Juillet 2006
    Messages : 133
    Points : 90
    Points
    90
    Par défaut
    Force de persévérer j'ai trouvé la solution, j'ai fait une jointure sur une sous requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT T1.ID, T1.Nom, Tmp.Designation AS Alea
    FROM 
    T1
    LEFT OUTER JOIN 
    (
    	SELECT CAST(RIGHT(T2.Nom,3) AS INTEGER) AS ALEA, T2.Valeur AS Designation
    	FROM T2 
    	WHERE LEFT(T2.Nom,4)='ALEA'
    ) AS Tmp
    ON T1.ALEA = Tmp.ALEA
    J'ai eu quelque soucis pour l’exécuter sur mon SGBD HFSQL à travers un connecteur ODBC.
    Le connecteur ODBC ne reconnaissait pas la sous-requête, alors que l'éxécuteur HFSQL fonctionnait correctement
    ODBC me renvoyait : "La table Tmp n'existe pas"

    J'ai simplement mis à jour mon driver ODBC HFSQL de la V19 à la V21, est tout est rentré dans l'ordre !

    Merci pour votre aide !

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 300
    Points : 39 641
    Points
    39 641
    Billets dans le blog
    9
    Par défaut
    Sur quelle volumétrie avez vous validé cette solution ?
    Ce type de requête avec des volumes significatifs va prendre un temps considérable !
    Si vous avez validé sur un échantillon et que votre requête a vocation à être exécutée en production sur des volumes importants la différence sera spectaculaire
    Je serai curieux de connaitre le nom du fournisseur qui a osé produire une base de donnée aussi mer#@*

  9. #9
    Membre régulier
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juillet 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Juillet 2006
    Messages : 133
    Points : 90
    Points
    90
    Par défaut
    En effet, j'ai validé cela sur un échantillon de T1 = 100 et T2 = 2.
    Cependant T2 sera guère plus grande qu'une 20aine d'enregistrements.
    Pour ce qui est de T1 elle est susceptible de monter à 50 000.

    Hé hé non désolé mais je ne vous dévoilerai pas le nom de l'éditeur de ce logiciel.
    Mais je vous avou que, depuis que je me suis lancé la dedans, je me dis que toute la conception de ce logiciel a été codé avec les pieds ... :S
    Le pire c'est d'avoir payé pour cela .... Malheureusement pour des non connaisseurs, on peut vite se faire avoir.

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

Discussions similaires

  1. [MySQL] jointure avec condition
    Par marochlo dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 07/03/2009, 10h08
  2. [SSIS][2k5] jointure avec condition
    Par Jenormand dans le forum SSIS
    Réponses: 4
    Dernier message: 11/07/2008, 10h51
  3. [2000] Un "casse tete" de requete :) Jointure avec conditions
    Par yepAccess dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 11/04/2008, 21h05
  4. Jointure avec condition
    Par Mookie dans le forum Ruby on Rails
    Réponses: 2
    Dernier message: 20/05/2007, 22h32
  5. Jointure avec conditions sur plusieurs colonnes
    Par ben53 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 28/11/2005, 09h27

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