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 :

Récupération de résultat


Sujet :

Langage SQL

  1. #1
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    933
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 933
    Points : 348
    Points
    348
    Par défaut Récupération de résultat
    Bonjour,
    j'ai un petit soucis, j'ai une requete sql qui ne me retourne pas tout les résultats, seulement elle est assez particulière, logiquement elle doit me retourner toute la liste des personnes qui travaille dans une banque, sur l'année civile ( ex 2017), avec un montant etc... mais ce que je veux également ce sont la liste des anciennes banques où ils ont déjà travaillé, seulement un paramètre obligatoire est le numéro de banque voir exemple ci dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    select  nom, prenom, montant, identifiant
    from table1
    inner join .....
    inner join .....;
    where identifiantEntreprise='120'  //parametre 1 : numBanque actuel pour CA
    and .....
    .....
    and date=.....
    cette requete me retourne par exemple 3 lignes :
    Gerard Dupont CA .....
    Gerard Dupont CA .....
    Gerard Dupont CA .....

    sachant que normalement ça doit me retourné :
    Gerard Dupont CA .....2017...
    Gerard Dupont CA .....
    Gerard Dupont CA .....
    Gerard Dupont laposte.....
    Gerard Dupont credimut.....
    etc....

    Comme j'ai un paramètre obligatoire , je ne sais pas comment faire ma requête pour prendre en compte les autres banques, est il possible de retourné les autres lignes avec une jointures ou une sous requete ?

    Un grand Merci pour vos conseils

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select  nom, prenom, montant, identifiant
    cette requete me retourne par exemple 3 lignes :
    Gerard Dupont CA .....
    Gerard Dupont CA .....
    Gerard Dupont CA .....
    Ça m'étonnerait !

    2)
    logiquement elle doit me retourner toute la liste des personnes qui travaille dans une banque
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where identifiantEntreprise='120'  //parametre 1 : numBanque actuel pour CA
    Par "dans une banque", vous voulez dire "dans une banque en particulier" (dans votre exemple, la banque CA) ?

    3)
    mais ce que je veux également ce sont la liste des anciennes banques où ils ont déjà travaillé
    Donc vous cherchez toutes les banques où ont travaillé ceux qui travaillent actuellement dans la banque CA ?

    Comme vous ne donnez pas la structure de vos tables, on ne peut que faire des suppositions.

    Décomposez votre problème :
    A) Quels sont les personnes travaillant dans la banque CA ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT p.prs_id, p.prs_prenom, p.prs_nom
    FROM te_personne_prs p
    INNER JOIN tj_prs_travailler_bnq_ptb j ON j.ptb_id_personne = p.prs_id
    	INNER JOIN te_banque_bnq b ON b.bnq_id = j.ptb_id_banque
    WHERE b.bnq_code = 'CA'
    	AND j.ptb_date_fin IS NULL
    B) Dans quelles banques ont travaillé ces personnes avant de travailler au CA ?
    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 t.prs_prenom, t.prs_nom, b1.bnq_code
    FROM
    (
    	SELECT p.prs_id, p.prs_prenom, p.prs_nom
    	FROM te_personne_prs p
    	INNER JOIN tj_prs_travailler_bnq_ptb j ON j.ptb_id_personne = p.prs_id
    		INNER JOIN te_banque_bnq b ON b.bnq_id = j.ptb_id_banque
    	WHERE b.bnq_code = 'CA'
    		AND j.ptb_date_fin IS NULL
    ) t
    INNER JOIN tj_prs_travailler_bnq_ptb j1 ON j1.ptb_id_personne = t.prs_id
    	INNER JOIN te_banque_bnq b1 ON b1.bnq_id = j1.ptb_id_banque
    WHERE b1.bnq_code <> 'CA'
    	AND j1.ptb_date_fin IS NOT NULL
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    933
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 933
    Points : 348
    Points
    348
    Par défaut
    Bonjour,

    2)
    Par "dans une banque", vous voulez dire "dans une banque en particulier" (dans votre exemple, la banque CA) ? oui donc dans mon paramètre quand j'exécute la requete je met l'identfiantreq correspondant à CA et j'obtient :
    Gerard Dupont CA .....
    Gerard Dupont CA .....
    Gerard Dupont CA .....
    3)
    Donc vous cherchez toutes les banques où ont travaillé ceux qui travaillent actuellement dans la banque CA ?
    c'est exact donc lorsque j'execute la requete je suis cencé obtenir :
    Gerard Dupont CA .....
    Gerard Dupont CA .....
    Gerard Dupont CA .....
    Gerard Dupont creditmut.....
    etc.....

    Je n'est pas mis la structure car j'ai essayé de simplifier au mieux pour comprendre le problème, car ma requête fait 122 lignes initialement .
    Pour résumer la structure de ma requête :

    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
     
    select  nom, prenom, montant, identifiant
    from table1
    inner join .....
    inner join .....
    inner join .....
    inner join .....
    inner join .....
    inner join .....
    inner join .....
    where identifiantEntreprise='120'    //parametre 1 : numBanque actuel pour CA
    and date=......        //ici c'est normal
    and code in(.....)    //ici c'est normal
     
     
    .....
    and date=.....

    Décomposez votre problème :
    A) Quels sont les personnes travaillant dans la banque CA ?
    Cela c'est ok par contre :

    B) Dans quelles banques ont travaillé ces personnes avant de travailler au CA ?
    là quand j'essaye votre méthode :
    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
     
    select  nom, prenom, montant, identifiant
    from (
    select  nom, prenom, montant, identifiant
    from table1
    inner join .....
    inner join .....
    inner join .....
    inner join .....
    inner join .....
    inner join .....
    inner join .....
    where identifiantEntreprise='120'    //parametre 1 : numBanque actuel pour CA
    and date=......        //ici c'est normal
    and code in(.....)    //ici c'est normal
    .....
    )
    table1  
    inner join table1 on table1.etc....   //pb ici identificateur non valide
    inner join .....
    inner join .....
    inner join .....
    inner join .....
    inner join .....
    inner join .....
    where identifiantEntreprise='120'    //parametre 1 : numBanque actuel pour CA
    and date=......        //ici c'est normal
    and code in(.....)    //ici c'est normal
     
    il me dit qu'il y a un probleme, identificateur non valide 
    inner join .....
    inner join .....
    inner join .....
    inner join .....
    inner join .....
    inner join .....
    inner join .....
    where identifiantEntreprise='120'    //parametre 1 : numBanque actuel pour CA
    and date=......        //ici c'est normal
    and code in(.....)    //ici c'est normal
     
     
    .....
    à mon avis j'ai l'impression qu'en faisant :
    select ......
    from ( select ....from ....) table 1 inner join etc ça ne me reconnait pas mon identificateur jusque apres la ss requête est ce normal ?
    merci à vous !

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Je n'est pas mis la structure car j'ai essayé de simplifier au mieux pour comprendre le problème, car ma requête fait 122 lignes initialement .
    C'est la structure des tables qui aiderait à comprendre !

    122 lignes pour une requête... ça commence à faire un peu beaucoup quand même !
    On peut voir la requête complète ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    933
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 933
    Points : 348
    Points
    348
    Par défaut
    et encore 122 lignes c'est rien à côté de ce que j'ai vu, pour l'instant ce sont des évolutions de requêtes, peuvent atteindre jusque 150 à 200 lignes facile.

    Pour la structure ça va être compliqué, dans la requête je fais appel à 8 tables, sans compter les NVL qu'il y a .


    Par ailleurs, pouvez vous m'expliquer la structure :

    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
     
    SELECT t.prs_prenom, t.prs_nom, b1.bnq_code
    FROM
    (
    	SELECT p.prs_id, p.prs_prenom, p.prs_nom
    	FROM te_personne_prs p
    	INNER JOIN tj_prs_travailler_bnq_ptb j ON j.ptb_id_personne = p.prs_id    
    		INNER JOIN te_banque_bnq b ON b.bnq_id = j.ptb_id_banque
    	WHERE b.bnq_code = 'CA'
    		AND j.ptb_date_fin IS NULL
    ) t
    INNER JOIN tj_prs_travailler_bnq_ptb j1 ON j1.ptb_id_personne = t.prs_id
    	INNER JOIN te_banque_bnq b1 ON b1.bnq_id = j1.ptb_id_banque
    WHERE b1.bnq_code <> 'CA'
    	AND j1.ptb_date_fin IS NOT NULL
    j'ai du mal à saisir le concept quand il fait select from ( select ..... ) t ..

    Merci bien !

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    On peut faire un SELECT sur une table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT les_colonnes
    FROM la_table
    On peut faire un SELECT sur plusieurs tables jointes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT les_colonnes
    FROM une_table t1
    INNER JOIN une_autre_table t2 ON condition_de_jointure
    On peut faire un SELECT sur une sous-requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT les_colonnes
    FROM
    (
      SELECT des_colonnes
      FROM une_table
    ) t
    Que ne comprenez-vous pas ?

    Dans ma requête, que j'ai pourtant détaillée dans mon message #2, la sous-requête donne les personnes travaillant actuellement à la banque de code "CA".
    La requête principale fait une jointure sur cette sous-requête pour ne conserver que ces personnes et en cherchant les banques dans lesquelles elles ont travaillé dans le passé.

    Sans la structure de vos tables et sans votre requête, ça va être difficile de vous aider davantage.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

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

    Pour compléter la réponse qui précède l'ordre SELECT se rapporte à des tables (ou à des vues) et le résultat d'un SELECT est aussi une table
    Du coup rien de surprenant à ce qu'un SELECT utilise le résultat d'un autre SELECT : SELECT col1, col2, ..., coln from (SELECT ... FROM... WHERE) where ...

    Ce qui m'inquiète dans la pseudo-requête que vous communiquez c'est qu'il semble y avoir un nombre considérable et déraisonnable de jointures.

    Il faut donc, comme demandé par Cinéphil, que vous communiquiez votre requête exacte ainsi que le rôle de chacune des tables

  8. #8
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    933
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 933
    Points : 348
    Points
    348
    Par défaut
    merci pour votre retour, voici la structure de la table, simplifié :

    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 
    t1.id, 
    t2.nom,
    ....,
    nvl(...),
    nvl(...),
    from table1 t1
    inner join table2 t2 on t2.id = t1.id
    inner join table3 t3 on t3.id=t2.idreft3
    ........
    .........
    where identifiantEntreprise='120'  //parametre 1 : numBanque actuel pour CA
    and .....      //je reprend mon exemple
    .....
    and date>='01/01/2016'    //condition sur l'année civile
    and date<='31/12/2016'
    //apres on  a toute une liste de condition obligatoire
    Pour info j'avais essayé une union de la meme requete mais ça aurait été trop beau, dans la 2eme requete j'ai juste changé where identifiantEntreprise='120' en where identifiantEntreprise<>'120'
    J'ai obtenu donc tout mes salarié de l'entreprise actuel + celle dans laquelle ils ont travaillé au cours de l'année, mais j'avais beaucoup de ligne en plus.

    Bonjour,

    Pour compléter la réponse qui précède l'ordre SELECT se rapporte à des tables (ou à des vues) et le résultat d'un SELECT est aussi une table
    Du coup rien de surprenant à ce qu'un SELECT utilise le résultat d'un autre SELECT : SELECT col1, col2, ..., coln from (SELECT ... FROM... WHERE) where ...

    Ce qui m'inquiète dans la pseudo-requête que vous communiquez c'est qu'il semble y avoir un nombre considérable et déraisonnable de jointures.

    Il faut donc, comme demandé par Cinéphil, que vous communiquiez votre requête exacte ainsi que le rôle de chacune des tables
    j'espere que la structure simplifié de ma requete saura vous aidé

  9. #9
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    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 134
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Je ne sais pas en quelle langue il faut le dire mais : tant que vous ne communiquez qu'une partie de votre requete, personne ne pourra vous aider !
    il faut à minima tous les critères de jointure, tous les critères de filtrage et toutes les sous-requêtes, seules les colonnes du select n'ont pas d'importance, sauf si vous faites un groupage ou un tri.

    Autre possibilité : communiquez le DDL complet de toutes vos tables ou vues requises (ordres CREATE TABLE ou CREATE VIEW) un extrait du jeu de données en entrée, et un exemple de résultat attendu

  10. #10
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    933
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 933
    Points : 348
    Points
    348
    Par défaut
    je regarderais ça demain lorsque je rentrerais ^ merci

  11. #11
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    933
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 933
    Points : 348
    Points
    348
    Par défaut
    Bonjour,
    voici la requête d'origine, donc j'ai enlevé quelques colonnes de selection puor la rendre plus courte

    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
     
    SELECT  DISTINCT
    numero_ent AS Matricule,
    nom_personne|| ' '|| prenom_personne                              AS nom              ,
    t2.statut                                                         AS QUALIFICATION    ,
    t6.annee                                                          AS Annee            ,
    TO_CHAR(t7.dateexercice,'dd/mm/yy')                               AS DatePaiement     ,
    ROUND(t1.indemnite,2)                                             AS INDEMNITES_BRUTES,
     
            NVL(
    			(
    			SELECT
    			SUM(t41.id_trancheBase1) AS base_4030
    			FROM
    			table10 t41
    			WHERE t41.idrefT1=t1.id),0
    		) AS BASE_TR_1,
    		FROM
            table1 t1
    		INNER JOIN        table2 t2		ON        t1.idrefT3 = t2.idrefT3
    		INNER JOIN        table3 t3		ON        t2.idrefT3 = t3.id
    		INNER JOIN        table4 t4		ON        t3.idrp=t4.id
    		INNER JOIN        table5 t5		ON        t4.idrefT5=t5.idrefT5
    		INNER JOIN        table6 t6		ON        t3.idreft6 = t6.id
    		INNER JOIN        table7 t7		ON        t1.idrefT7= t7.id
    		INNER JOIN        table4 t8		ON        t8.id=t2.c211_idEnt
    		INNER JOIN        table9 t9		ON        t9.x508_idgrp_1 =t8.id	AND     t9.x508_idrp_2 =t4.id
    		AND     t9.X508_JUSQUAU>= to_date('$anneeRecherche/12/31','yyyy/mm/dd')
    		WHERE    t8.x503_matricule  ='$NumEntreprise'
    		AND     t7.dateexercice   >= to_date('$anneeRecherche/01/01','yyyy/mm/dd')
    		AND     t7.dateexercice   <= t9.Date_JUSQUAU 
    /*		condition qui doit me prendre toute les personnes sur une année civile ex: entre le 01/01/2017 et le 31/12/2017
    			- s'il na pas cassé son contrat, t9.Date_JUSQUAU=31/12/99 par defaut car il est toujours là mais 
    			- s'il a cassé son contrat en ../03/2017 alors qu'il est dans l'entreprise A et qu'il va dans l'entreprise B
    			je veux qu'il m'affiche la personne, quand il a été dans l'entreprise A du 01/01/17 au ../03/2017
    			et dans l'entreprise B du ../03/2017 au 31/12/99 .
    			31/12/99 veut dire qu'ilest tjr dans l'ent A , mais s'il n'y ai pu , la date se met a jour mais ça c'esst une autre histoire....
    			*/
    		AND     t2.statutpersonne IN ('ETAM' ,'ETAMA','ETAMB','IAC','IAC1','IAC2' ,'ING')
    		ORDER BY numero_ent_ent,	t6.annee	
    		/*
    		et donc j'aimerais avoir les personnes, ainsi que toutes les entreprises dans laquel il a été, durant la période precisé, sachant 
    		que cette condition doit resté WHERE    t8.x503_matricule  ='$NumEntreprise' et je sais pas comment remanier la requete
    		*/
    donc là en gros je séléctionne toutes les personnes dans l'entreprise $NumEntreprise'
    un grand merci

  12. #12
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Décidément, c'est difficile de vous aider !

    Comme on ne sait pas de quelles tables viennent numero_ent, nom_personne, prenom_personne, comment je peux savoir quelle table prendre pour faire la sous-requête comme je l'ai indiqué dans mon message #2 ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  13. #13
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    933
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 933
    Points : 348
    Points
    348
    Par défaut
    Oui pardon j'ai omis ce détails
    Num_ent vient de la table t4, or la table t4 et t8 sont les même, ce qui différe c'est la jointure.
    Pour résumer d'après ce que j'ai compris en analysant la requête :
    On fait une jointure sur la table t4 avec une autre table pour avoir la correspondance de données et une jointure de cette même table (appelé différemment donc t8) avec une autre table pour qu'il y ai correspondance avec les donnés d'une autre table.
    Pour être clair je prend un exemple :
    ............
    From table1
    Inner join Personne t4 on t4.id=t1.Idreft4
    Inner join ........
    Inner join Personne t8 on t8.id =t5. Idreft8
    Sachant que t5 c'est une table déclaré

    Cela peut il vous aider ? En tt cas merci pour votre aide

  14. #14
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Reprends mon message 2 et commence par faire la sous-requête la plus simple possible pour donner les personnes (seulement leur ID, ça devrait suffire et ça peut éviter des jointures) qui travaillent dans la banque donnée dans la condition WHERE (si j'ai bien compris, c'est cette condition là : WHERE t8.x503_matricule ='$NumEntreprise').

    Et donnez-nous ce morceau de requête pour parte sur une base saine. Et au lieu d'anonymiser totalement vos tables en les appelant table1 table2... tablen, donnez nous des noms signifiants (personne, banque, personne_banque...) même si ce ne sont pas les vrais noms. Ce sera plus facile pour que nous puissions vous aider.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  15. #15
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    933
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 933
    Points : 348
    Points
    348
    Par défaut
    Bonjour,

    voici la requete dans laquelle j'ai nommé les 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
    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
     
    		SELECT  DISTINCT
    numero_ent AS Matricule,
    nom_personne|| ' '|| prenom_personne                              AS nom              ,
    t2.statut                                                         AS QUALIFICATION    ,
    t6.annee                                                          AS Annee            ,
    TO_CHAR(t7.dateexercice,'dd/mm/yy')                               AS DatePaiement     ,
    ROUND(t1.indemnite,2)                                             AS INDEMNITES_BRUTES,
     
            NVL(
    			(
    			SELECT
    			SUM(t41.id_trancheBase1) AS base_4030
    			FROM
    			TableConsoExercice t41
    			WHERE t41.idrefT1=t1.id),0
    		) AS BASE_TR_1,
    		FROM        Tablepaiement3 t1
    		INNER JOIN        archive2 t2		ON        t1.idrefT3 = t2.idrefT3
    		INNER JOIN        archive1 t3		ON        t2.idrefT3 = t3.id
    		INNER JOIN        entreprise t4		ON        t3.idrp=t4.id
    		INNER JOIN        personne t5		ON        t4.idrefT5=t5.idrefT5
    		INNER JOIN        campagneExercice1 t6		ON        t3.idreft6 = t6.id
    		INNER JOIN        tablePaiement2 t7		ON        t1.idrefT7= t7.id
    		INNER JOIN        entreprise t8		ON        t8.id=t2.c211_idEnt
    		INNER JOIN        tableRelationEnt t9		ON        t9.idrp_1 =t8.id	AND     t9.idrp_2 =t4.id
    		AND     t9.X508_JUSQUAU>= to_date('$anneeRecherche/12/31','yyyy/mm/dd')
    		WHERE    t8.x503_matricule  ='$NumEntreprise'
    		AND     t7.dateexercice   >= to_date('$anneeRecherche/01/01','yyyy/mm/dd')
    		AND     t7.dateexercice   <= t9.Date_JUSQUAU 
    /*		condition qui doit me prendre toute les personnes sur une année civile ex: entre le 01/01/2017 et le 31/12/2017
    			- s'il na pas cassé son contrat, t9.Date_JUSQUAU=31/12/99 par defaut car il est toujours là mais 
    			- s'il a cassé son contrat en ../03/2017 alors qu'il est dans l'entreprise A et qu'il va dans l'entreprise B
    			je veux qu'il m'affiche la personne, quand il a été dans l'entreprise A du 01/01/17 au ../03/2017
    			et dans l'entreprise B du ../03/2017 au 31/12/99 .
    			31/12/99 veut dire qu'ilest tjr dans l'ent A , mais s'il n'y ai pu , la date se met a jour mais ça c'esst une autre histoire....
    			*/
    		AND     t2.statutpersonne IN ('ETAM' ,'ETAMA','ETAMB','IAC','IAC1','IAC2' ,'ING')
    		ORDER BY numero_ent_ent,	t6.annee	
    		/*
    		et donc j'aimerais avoir les personnes, ainsi que toutes les entreprises dans laquel il a été, durant la période precisé, sachant 
    		que cette condition doit resté WHERE    t8.x503_matricule  ='$NumEntreprise' et je sais pas comment remanier la requete
    		*/
    2)
    Reprends mon message 2 et commence par faire la sous-requête la plus simple possible pour donner les personnes (seulement leur ID, ça devrait suffire et ça peut éviter des jointures) qui travaillent dans la banque donnée dans la condition WHERE (si j'ai bien compris, c'est cette condition là : WHERE t8.x503_matricule ='$NumEntreprise').
    oui c'est bien avec cette condition, je fais ça et viens aux nouvelles, merci !

  16. #16
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    933
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 933
    Points : 348
    Points
    348
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Reprends mon message 2 et commence par faire la sous-requête la plus simple possible pour donner les personnes (seulement leur ID, ça devrait suffire et ça peut éviter des jointures) qui travaillent dans la banque donnée dans la condition WHERE (si j'ai bien compris, c'est cette condition là : WHERE t8.x503_matricule ='$NumEntreprise').

    Et donnez-nous ce morceau de requête pour parte sur une base saine. Et au lieu d'anonymiser totalement vos tables en les appelant table1 table2... tablen, donnez nous des noms signifiants (personne, banque, personne_banque...) même si ce ne sont pas les vrais noms. Ce sera plus facile pour que nous puissions vous aider.
    voici la requête permettant de récupérer uniquement les identifiants des personnes dans l'entreprise nument

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    select t5.id /*ici on récupérer les id des personnes*/ 
    	from Tablepaiement3 t1
    		INNER JOIN        archive2 t2		ON        t1.idrefT3 = t2.idrefT3
    		INNER JOIN        archive1 t3		ON        t2.idrefT3 = t3.id
    		INNER JOIN        entreprise t4		ON        t3.idrp=t4.id
    		INNER JOIN        personne t5		ON        t4.idrefT5=t5.idrefT5
    		INNER JOIN        campagneExercice1 t6		ON        t3.idreft6 = t6.id
    		INNER JOIN        tablePaiement2 t7		ON        t1.idrefT7= t7.id
    		INNER JOIN        entreprise t8		ON        t8.id=t2.c211_idEnt
    		INNER JOIN        tableRelationEnt  t9		ON        t9.idrp_1 =t8.id	AND     t9.idrp_2 =t4.id
    	where  t8.num_ent='$NumEnt'
    je suis obligé de faire la jointure car il doit y avoir correspondance avec les autres tables

  17. #17
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    On va enfin commencer à y voir plus clair !

    Est-ce que ceci ne serait pas suffisant pour cette première requête destinée seulement à trouver les personnes travaillant dans telle entreprise ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select t5.id
    from archive2 t2
    INNER JOIN        entreprise t8		ON        t8.id=t2.c211_idEnt
    INNER JOIN        archive1 t3		ON        t2.idrefT3 = t3.id
    	INNER JOIN        entreprise t4		ON        t3.idrp=t4.id
    		INNER JOIN        personne t5		ON        t4.idrefT5=t5.idrefT5
    where  t8.num_ent='$NumEnt'
    N'y a t-il pas un moyen plus simple de relier entreprise à personne sans passer par archive1 et archive2 et une autre instance de entreprise ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  18. #18
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    933
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 933
    Points : 348
    Points
    348
    Par défaut
    Bonjour,


    Est-ce que ceci ne serait pas suffisant pour cette première requête destinée seulement à trouver les personnes travaillant dans telle entreprise ?
    techniquement oui puisque avec cette seul requête, on a tous les identifiants des personnes travaillant dans l'entreprise numEnt

    N'y a t-il pas un moyen plus simple de relier entreprise à personne sans passer par archive1 et archive2 et une autre instance de entreprise ?
    hum je pense pas car ce sont deux tables bien distinctes, elles ont des données différentes et on les relie via la jointure, d'un côté on a la table concernant les entreprises et de l'autres d'autres données .

  19. #19
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Maintenant que je relis ma requête après une nuit de sommeil, il semble y avoir un lien direct entre personne et entreprise, non ?
    Donc pour ce premier besoin, ceci suffirait, non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT p.id
    FROM personne p
    INNER JOIN entreprise e ON e.id = p.id_entreprise
    WHERE e.num_ent = :NumEnt
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  20. #20
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    933
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 933
    Points : 348
    Points
    348
    Par défaut
    exact, seulement je ne peux pas mettre qu'une seule jointure, enfin à ma connaissance, car il doit avoir correspondance avec les autres tables donc selon moi dans toute sous requête, j'aurais techniquement les autres inner join

    au passage, j'ai joints un petit schéma qui représente les données a récupéré pour aider à mieux comprendre

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. [Scanner] Pb avec la récupération du résultat...
    Par Jutige dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 17/07/2006, 16h19
  2. récupération de résultat
    Par Monstros Velu dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 20/04/2006, 10h12
  3. Réponses: 2
    Dernier message: 29/03/2006, 09h38
  4. Récupération du résultat d'une commande shell
    Par klu dans le forum Langage
    Réponses: 8
    Dernier message: 16/02/2006, 23h34
  5. [SQL SERVER 2000]Récupération du résultat d'un select.
    Par gwadakillah dans le forum Langage SQL
    Réponses: 5
    Dernier message: 24/01/2006, 13h35

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