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

DB2 Discussion :

Jointure 3 fichiers


Sujet :

DB2

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mai 2022
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2022
    Messages : 11
    Points : 11
    Points
    11
    Par défaut Jointure 3 fichiers
    Bonjour,

    j'ai 3 fichiers avec 2 enregistrements contenant le num dans chaque table, je fais la requête suivante :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT * FROM restore/table1 a
    inner join restore/table2 b   
    on b.num = a.num         
    inner join restore/table 3 c   
    on c.num = b.num         
    where a.num = '10000000'

    le résultat :

    NUM
    10000000
    10000000
    10000000
    10000000
    10000000
    10000000
    10000000
    10000000

    pourquoi je n'ai pas que 2 lignes en résultat ? sachant que je sélectionne sur 120 colonnes si je fais un group by il faut que je mettes les 120 colonnes. un peu lourd, y a t'il une autre solution ?

    MERCI

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    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 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Ceci n'est pas clair :

    Citation Envoyé par christophe02400 Voir le message
    j'ai 3 fichiers avec 2 enregistrements contenant le num dans chaque table
    Soit il s'agit de fichiers, soit de lignes dans des tables, de quoi s'agit il ici ?


    Par ailleurs, la requête est invalide : le slash est un caractère spécial, son utilisation nécessite d'encadrer le nom de l'objet concerné par des guillemets, de plus, faire un SELECT *, en particulier quand il y a des jointures, est contre-performant. Il y a probablement des colonnes dont on n'a pas besoin qui sont transportées inutilement et encombrent donc le réseau, à commencer par la colonne "num" de jointure qu'on a ici 3 fois puisqu'il y a 3 tables
    Pensez à utiliser les balises CODE pour encadrer vos requêtes, c'est plus facile à lire (je l'ai corrigé pour vous )


    Citation Envoyé par christophe02400 Voir le message
    pourquoi je n'ai pas que 2 lignes en résultat ? sachant que je sélectionne sur 120 colonnes si je fais un group by il faut que je mettes les 120 colonnes. un peu lourd, y a t'il une autre solution ?
    Parcequ'il y a des relations n-aires entre les tables.


    Pour plus d'explications, il faut communiquer le DDL de création des tables et un exemple (extrait) de leur contenu

  3. #3
    Membre à l'essai
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mai 2022
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2022
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    Bonjour,

    je suis sur as400 donc j'utilise les / pour les tables et je n'ai pas de DDL sur as400

    pour le test du select j'ai mis * sinon je sélectionne des colonnes mais comme j'en ai 120 je ne les ai pas mises dans l'exemple.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mai 2022
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2022
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    Pour essayer d'être plus clair, j'ai 3 tables, je veux tous les enregistrement de la table 1 avec des champs en plus qui sont dans la table2 et la table3.

    je ne ssais pas si je suis plus clair

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    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 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    Le DDL (Data Definition Language) est la sous-partie du langage SQL qui permet de créer, supprimer et modifier les objets (tables, index, fonctions, triggers...) de la base de données. Les scripts de création des tables et index (ordres DROP, CREATE et ALTER) sont du DDL.
    C'est ce script qu'il faut nous communiquer ainsi qu'un extrait du contenu de chacune des 3 tables.

    Pour le nombre de lignes en résultat, prenons un exemple.
    La première table est la table des clients, la deuxième, celle des commandes client et la troisième, celle des lignes de commande client.
    Si en moyenne, un client possède 3 commandes et que chaque commande possède en moyenne 10 lignes, une jointure entre ces 3 tables sans regroupement ni clause DISTINCT produira en moyenne 30 lignes par client.


    Citation Envoyé par christophe02400 Voir le message
    pour le test du select j'ai mis * sinon je sélectionne des colonnes mais comme j'en ai 120 je ne les ai pas mises dans l'exemple.
    Il est rare d'avoir besoin d'autant de colonnes. Chaque colonne transportée a un cout réseau au détriment des petits camarades. À vérifier.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mai 2022
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2022
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    Merci de m'avoir aiguillé je suis parti sur un DISTINCT j'ai ajouté la ligne ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where a.numadh = (select distinct b.numadh from restore.cartec1) and a.numpag = (select distinct b.numpag from restore.cartec1)
    ca fonctionne

    Après au niveau des performances ce n'est pas grave c'est un traitement annuel qui prends 30s

    MERCI

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Ingénieur d'Etude Mainframe/AS400
    Inscrit en
    Novembre 2012
    Messages
    1 765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'Etude Mainframe/AS400
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2012
    Messages : 1 765
    Points : 10 748
    Points
    10 748
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Bonjour,
    Soit il s'agit de fichiers, soit de lignes dans des tables, de quoi s'agit il ici ?
    Sur l'AS400 les fichiers (généré par DDS) sont utilisables comme des tables. On peut même croiser des tables format DDL et fichier format DDS dans des requêtes.

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    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 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    Il y a plus de 15 ans que je n'ai plus travaillé sur AS/400
    Si on peut requêter par SQL sur des fichiers séquentiels, il est très probable que l'AS/400 crée des tables temporaires pour ce besoin, vu quee langage SQL ne s'applique que sur les bases de données relationnelles.
    Autre possibilité, la requête SQL est traduite en ordres de lecture des fichiers séquentiels, comme le faisait naguère IDEAL/DATACOM, mais les performances d'accès sont pitoyables dès que le volume à traiter devient important.

  9. #9
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Points : 3 283
    Points
    3 283
    Par défaut
    Attention, bien des choses ont changé sur cette machine, et notamment autour de la base de données; à noter qu'on ne dit plus AS/400 mais IBM i ...

    Allez voir sur le forum la partie dédiée à cette machine ...

  10. #10
    Membre chevronné Avatar de bernard59139
    Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2006
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Octobre 2006
    Messages : 950
    Points : 2 064
    Points
    2 064
    Par défaut
    Bonjour

    sans être sur que ce soit valide sur IBM I, je propose
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT * FROM restore/table1 a
    where exists (select * from restore/table2 b   
                  where b.num = a.num)
      and exists (select * from restore/table3 c   
                  where  c.num = a.num)
    where a.num = '10000000'
    les "select distinct" sont une catastrophe dans des sous requêtes.

  11. #11
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    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 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    Si on n'a besoin que de la colonne de jointure, on peut aussi utiliser INTERSECT qu'on a rarement l'occasion de mettre en œuvre :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT T1.num 
    FROM restore/table1 as T1
    intersect 
    SELECT T2.num 
    FROM restore/table2 as T2
    intersect
    SELECT T3.num 
    FROM restore/table3 as T3
    where T1.num = '10000000'

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Ingénieur d'Etude Mainframe/AS400
    Inscrit en
    Novembre 2012
    Messages
    1 765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'Etude Mainframe/AS400
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2012
    Messages : 1 765
    Points : 10 748
    Points
    10 748
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Il y a plus de 15 ans que je n'ai plus travaillé sur AS/400
    Si on peut requêter par SQL sur des fichiers séquentiels, il est très probable que l'AS/400 crée des tables temporaires pour ce besoin, vu quee langage SQL ne s'applique que sur les bases de données relationnelles.
    Autre possibilité, la requête SQL est traduite en ordres de lecture des fichiers séquentiels, comme le faisait naguère IDEAL/DATACOM, mais les performances d'accès sont pitoyables dès que le volume à traiter devient important.
    Ces "fichiers" ont des logiques (qui sont proches d'index DB2) et les performances sont donc tout à fait correctes à condition de les utiliser correctement. Globalement tout ce qui est utilisable sous DB2 en terme de fonctionnalités SQL l'est sur sur ces "fichiers".

  13. #13
    Membre à l'essai
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mai 2022
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2022
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    Merci de vos réponses je vais tester les 2 requêtes ci-dessus et vous fait un retour...

  14. #14
    Membre à l'essai
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mai 2022
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2022
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    la requête avec les where exist fonctionne mais les performances sont catastrophiques. (30s avec inner join, 15mn avec where exist)

    la requête avec intersect ne fonctionne pas :
    Message : [SQL0512] L'instruction fait référence à des objets dans plusieurs bases de données. Cause . . . . . : L'instruction fait référence aux objets résidant sur plusieurs bases de données. Les objets peuvent être des noms d'objet explicitement qualifiés ou des noms d'alias définis pour référencer une autre base de données. Cette instruction SQL peut faire référence à une seule base de données uniquement. Une instruction CREATE TABLE AS qui effectue une sélection à partir d'une base de données éloignée ne peut pas référencer une table pour laquelle une instruction *FIELDPROC est définie. Elle ne peut pas définit une table de requêtes matérialisée. Si la base de données éloignée ne figure pas sur un serveur IBM i, les clauses INCLUDING ne sont pas admises. Que faire . . . : Assurez-vous que tous les objets utilisés dans l'instruction résident dans la même base de données. Renouvelez votre demande. *L'instruction mise en évidence a échoué, entraînant l'interruption du traitement

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

Discussions similaires

  1. jointure de fichier sur plusieurs colonnes
    Par Isabella83 dans le forum Langage
    Réponses: 2
    Dernier message: 26/03/2015, 16h25
  2. [XL-MAC 2008] Jointure 2 fichiers ?
    Par Mister Paul dans le forum Excel
    Réponses: 1
    Dernier message: 21/06/2011, 16h27
  3. jointure des fichiers
    Par Etudiante_Ines dans le forum Silverlight
    Réponses: 4
    Dernier message: 07/04/2011, 17h06
  4. Jointure à 3 fichiers
    Par windsor dans le forum WinDev
    Réponses: 4
    Dernier message: 28/08/2010, 11h48
  5. Macro de jointure entre fichiers texte
    Par comme de bien entendu dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 14/06/2008, 13h26

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