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 :

Objectif réalisable en une seule requête ?


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 115
    Points : 86
    Points
    86
    Par défaut Objectif réalisable en une seule requête ?
    Bonjour,

    J'ai une requête pour récupérer les e-mails de différents contact (client, externe, admin, agence, filiale) en fonction d'un numéro de dossier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select UserDoc.Email, DossierUser.UserRole from DossierUser
    inner join UserDoc on DossierUser.pk_idUser = UserDoc.pk_idUser
    inner join DossierDoc on DossierDoc.pk_idDoc = DossierUser.pk_idDossier
    where DossierDoc.Numero=1006012 and DossierUser.UserRole in ('1','2','4','5')
    Les chiffres 1,2,4,5 correspondent dans l'ordre aux contacts suivant :
    - admin
    - client
    - agence
    - externe

    Ce que je veux faire c'est récupérer tous les emails des contacts admin et les contact externe mais limité au champs upload = oui (cette limite doit affecter uniquement les contacts externe).

    Ce que je me demande c'est si cela est réalisable en une seule requête, car c'est uniquement les contacts externe que je veux limité au champs uplaod = oui. Pour les autres contacts que le champs upload soit a oui ou non je m'en cogne.

    (Désolé pour le titre de mon post qui n'est pas très explicite mais je ne savais pas quoi mettre)

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 920
    Points : 51 712
    Points
    51 712
    Billets dans le blog
    6
    Par défaut
    1) SQL est un langage complet au sens de la machine de TURING. A ce titre il peut résoudre n'importe quel problème en une seule requête quelque soit sa complexité, à condition que ce problème soit bien posé (modélisation des données)
    2) utilisez le CASE pour ce faire : http://sqlpro.developpez.com/cours/sqlaz/select/#L7
    3) respectez les règles de ce forum en postant le DDL de vos tables ainsi qu'un jeu d'essais sous forme INSERT : http://www.developpez.net/forums/a69...gage-sql-lire/

    A +

  3. #3
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 115
    Points : 86
    Points
    86
    Par défaut
    Merci pour le lien, j'ai écris quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    select case DossierUser.UserRole
    		when '5' then case UserDoc.UploaderOnLineFTP 
    					when 1 then UserDoc.Email
    				   end
    		else UserDoc.Email
    	end as email
    from DossierUser
    inner join UserDoc on DossierUser.pk_idUser = UserDoc.pk_idUser
    inner join DossierDoc on DossierDoc.pk_idDoc = DossierUser.pk_idDossier
    where DossierDoc.Numero=1006006 and DossierUser.UserRole in ('1','2','4','5')
    D'après mes tests ça me semble bien fonctionner. Par contre lorsque UserDoc.UploaderOnLineFTP est différent de 5 ça me retourne une ligne null (ce qui est logique et correct) mais existe t-il un moyen pour que mon select ne m'affiche pas ces ligne null ?

    Un truc du genre select IS NOT NULL(maColonne) ... m'aiderais énormément, avez vous une idée sur comment je peux faire ça ? (ca me parait très simple voir basique ce que je demande mais je ne trouve pas )

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 394
    Points
    18 394
    Par défaut
    Dans le filtre, la bonne syntaxe est :

  5. #5
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 115
    Points : 86
    Points
    86
    Par défaut
    J'avais testé, mais ça me met une erreur de syntaxe justement. Certainement à cause du case.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select case DossierUser.UserRole
    			when '5' then case UserDoc.UploaderOnLineFTP 
    							when 1 then UserDoc.Email
    						  end
    			else UserDoc.Email
    		end as email IS NOT NULL
    ...
    (j'ai également essayé de mettre IS NOT NULL avant le as mais j'ai le même problème e syntaxe)

    En tant normal, j'aurais laissé requête telle quelle et j'aurais géré les lignes null dans mon appli. avec un if mais là je dois fournir la requête et je ne sais pas ce qu'ils vont en faire...

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 394
    Points
    18 394
    Par défaut
    Les filtres sont dans le WHERE, pas dans le SELECT.

  7. #7
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    J'ai indenté ta requête différemment :
    Citation Envoyé par manu f Voir le message
    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 
      case DossierUser.UserRole
         when '5' then 
           case UserDoc.UploaderOnLineFTP 
             when 1 then UserDoc.Email
           end
         else UserDoc.Email
       end as email
    from DossierUser
    inner join UserDoc on DossierUser.pk_idUser = UserDoc.pk_idUser
    inner join DossierDoc on DossierDoc.pk_idDoc = DossierUser.pk_idDossier
    where DossierDoc.Numero=1006006 
      and DossierUser.UserRole in ('1','2','4','5')
    Par contre lorsque UserDoc.UploaderOnLineFTP est différent de 5 ça me retourne une ligne null (ce qui est logique et correct)
    Non ce n'est pas logique ! Tu devrais avoir UserDoc.Email !

    Par contre, quand DossierUser.UserRole = '5' et UserDoc.UploaderOnLineFTP est différent de 1 alors tu dois avoir NULL.

    mais existe t-il un moyen pour que mon select ne m'affiche pas ces ligne null ?
    En ajoutant dans le WHERE le contraire la condition qui fait que cela produit un NULL dans le SELECT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    WHERE DossierDoc.Numero=1006006 
        AND DossierUser.UserRole IN ('1','2','4','5')
        AND NOT (
            DossierUser.UserRole = '5'
            AND UserDoc.UploaderOnLineFTP = 1
        )
    Ou plus simplement en réduisant la liste du IN et en ajoutant la condition du CASE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT UserDoc.Email AS email
    FROM DossierUser
    INNER JOIN UserDoc ON DossierUser.pk_idUser = UserDoc.pk_idUser
    INNER JOIN DossierDoc ON DossierDoc.pk_idDoc = DossierUser.pk_idDossier
    WHERE DossierDoc.Numero=1006006 
        AND DossierUser.UserRole IN ('1','2','4')
        OR (
            DossierUser.UserRole = '5'
            AND UserDoc.UploaderOnLineFTP = 1
        )

  8. #8
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 115
    Points : 86
    Points
    86
    Par défaut
    Non ce n'est pas logique ! Tu devrais avoir UserDoc.Email !
    Quand DossierUser.UserRole = '5' ET UserDoc.UploaderOnLineFTP est différent de 1, j'aurais du préciser.

    Edit :
    Ca me semble fonctionner, je vais juste faire un peu plus de test, merci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT UserDoc.Email, DossierUser.UserRole
    FROM DossierUser
    INNER JOIN UserDoc ON DossierUser.pk_idUser = UserDoc.pk_idUser
    INNER JOIN DossierDoc ON DossierDoc.pk_idDoc = DossierUser.pk_idDossier
    WHERE DossierDoc.Numero=1006006 
        AND (DossierUser.UserRole IN ('1','2','4')
        OR (
            DossierUser.UserRole = '5'
            AND UserDoc.UploaderOnLineFTP = 1
        ))

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 03/03/2015, 11h17
  2. Max de MAX en une seule requête.
    Par gentoo dans le forum Langage SQL
    Réponses: 9
    Dernier message: 07/01/2007, 02h10
  3. [SQL] En une seule requête
    Par Spaccio dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 26/06/2006, 21h38
  4. Lier trois tables dans une seule requête ?
    Par tempirate dans le forum Requêtes
    Réponses: 2
    Dernier message: 18/06/2006, 20h27
  5. Insérer plusieurs enregistrements en une seule requête
    Par pyd001 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 26/02/2004, 11h38

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