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 :

sous requete SQL


Sujet :

Langage SQL

  1. #1
    Membre averti
    Avatar de onet
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    365
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2002
    Messages : 365
    Points : 344
    Points
    344
    Par défaut sous requete SQL
    Hello,

    Petite question que j'ai, dont je cherche la réponse, a savoir si je me dirige juste.

    J'ai une view qui fonctionne. je dois rajouter un champ dont la valeur doit venir d'une autre requete, comment je fais?

    Voici ma view (en terme d'exemple!):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT mes_champs_ok, toto FROM table1 LEFT JOIN table2
    Et j'aimerais que la valeur de toto soit le résultat d'une requete select que voici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT is_active
    FROM (
    (
    `admin_by_airport`
    LEFT JOIN contact ON (
    contact.id = admin_by_airport.contact_id
    )
    )
    LEFT JOIN sf_guard_user ON (
    contact.user_id = sf_guard_user.id
    )
    )
    WHERE admin_by_airport.company_id =411
    dont le admin_by_airport.company_id soit défini par la valeur dynamique. De plus, le select peut me renvoyer 1 ou plusieurs lignes, dont la valeur sera toujours 1 ou 0. Mais j'aimerais faire un OU sur ces valeurs (cad si une ou plusieurs valeurs est à 1, la valeur sera 1, si tout est a 0, ou qu'elle ne renvois rien, la valeur sera 0).

    Une idée pour faire cette view?
    Merci,
    Olivier

  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 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Une remarque pour commencer : toutes ces parenthèses dans votre sous-requête sont inutiles.

    Puisque la sous-requête peut retourner plusieurs lignes donnant chacune une valeur booléenne, l'idée serait de faire la somme de ces valeurs. Si c'est supérieur à 0, on donne la valeur 1 à toto, 0 sinon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT mes_champs_ok,
        CASE
            WHEN SUM(
                SELECT is_active
                FROM admin_by_airport
                LEFT JOIN contact ON contact.id = admin_by_airport.contact_id
                    LEFT JOIN sf_guard_user ON contact.user_id = sf_guard_user.id
                WHERE admin_by_airport.company_id =411
                ) > 1 THEN 1
            ELSE 0
        END AS toto
    FROM table1 
    LEFT JOIN table2 ON ...
    A tester avec votre cas concret.

  3. #3
    Membre averti
    Avatar de onet
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    365
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2002
    Messages : 365
    Points : 344
    Points
    344
    Par défaut
    Merci pour ce début d'information, ca me semble pas mal, je vais regarder exactement.

    Petite précision, comment je passe la valeur admin_by_airport.company_id dans mon case, pour qu'il soit cohérent avec les données retournée du select principal? (le 411 n'est qu'un exemple parmis d'autre, le case doit être effectué pour chaque lignes retournée dans la requete principale!).

    Merci.
    Onet

  4. #4
    Membre averti
    Avatar de onet
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    365
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2002
    Messages : 365
    Points : 344
    Points
    344
    Par défaut
    A titre d'information, voila ma requete complète, avec le case rajouter:

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    CREATE ALGORITHM=UNDEFINED DEFINER=`project`@`localhost` SQL SECURITY DEFINER VIEW `view_flies_to` AS 
     
    select 
        `apaptalrqdsgh`.`company_airport_id` AS `company_airport_id`,
        `ap`.`sf_account` AS `company_airport_sf_account`,
        `ap`.`iata_code` AS `company_airport_iata_code`,
        `ap`.`name` AS `airport_name`,
        `apaptalrqdsgh`.`airport_terminal_id` AS `airport_terminal_id`,
        `apt`.`sf_account` AS `airport_terminal_sf_account`,
        `apt`.`name` AS `airport_terminal_name`,
        `bcat`.`name` AS `airport_terminal_color`,
        `apaptalrqdsgh`.`company_airline_id` AS `company_airline_id`,
        `al`.`sf_account` AS `company_airline_sf_account`,
        `al`.`iata_code` AS `company_airline_iata_code`,
        `al`.`name` AS `airline_name`,
        `bcal`.`name` AS `airline_color`,
        `apaptalrqdsgh`.`reader` AS `reader`,
        `apaptalrqdsgh`.`bcbp_read` AS `bcbp_read_capable`,
        `apaptalrqdsgh`.`printer` AS `printer`,
        `apaptalrqdsgh`.`bcbp_print` AS `bcbp_print_capable`,
        `apaptalrqdsgh`.`request_id` AS `request_id`,
        `rq`.`req_status` AS `request_status`,
        `rq`.`bcbp_live_date` AS `request_live_date`,
        `apaptalrqdsgh`.`equipment_dcs_id` AS `equipment_dcs_id`,
        `ds`.`name` AS `dcs_name`,
        `apaptalrqdsgh`.`company_ground_handler_id` AS `company_ground_handler_id`,
        `gh`.`short_name` AS `ground_handler_name`,
        `al`.`bcbp_scope` AS `airline_scope`,
        `country`.`iso` AS `airline_sf_coutry_iso`,
        `country`.`name` AS `airline_sf_coutry_name`,
        `country`.`region` AS `airline_sf_region`, 
        CASE
                WHEN SUM(
                    SELECT is_active
                    FROM admin_by_airport
                    LEFT JOIN contact ON contact.id = admin_by_airport.contact_id
                        LEFT JOIN sf_guard_user ON contact.user_id = sf_guard_user.id
                    WHERE admin_by_airport.company_id =411
                    ) > 1 THEN 1
                ELSE 0
            END AS `toto`    
     
        from 
            `flies_to` `apaptalrqdsgh` 
            left join `company_airport` `ap` on `apaptalrqdsgh`.`company_airport_id` = `ap`.`id` 
                left join `airport_terminal` `apt` on `apaptalrqdsgh`.`airport_terminal_id` = `apt`.`id`
                    left join `company_airline` `al` on `apaptalrqdsgh`.`company_airline_id` = `al`.`id`
                        left join `country` on `al`.`country_id` = `country`.`id`
                            left join `bcbp_color` `bcal` on `al`.`bcbp_color_id` = `bcal`.`id` 
                             left join `bcbp_color` `bcat` on `apt`.`bcbp_color_id` = `bcat`.`id` 
                                left join `request` `rq` on `apaptalrqdsgh`.`request_id` = `rq`.`id` 
                                    left join `equipment_dcs` `ds` on `apaptalrqdsgh`.`equipment_dcs_id` = `ds`.`id`
                                        left join `company_ground_handler` `gh` on `apaptalrqdsgh`.`company_ground_handler_id` = `gh`.`id`
    Par contre,il me retourne un
    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT is_active FROM admin_by_airport LEFT JOIN contact ON contact.id' at line 32
    Alors que la requete sans le case fonctionne parfaitement (la requête a été effectuée par mon prédécesseur, ce n'est qu'une reprise et une évolution du système!).

    Merci.
    Onet

  5. #5
    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 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par onet Voir le message
    comment je passe la valeur admin_by_airport.company_id dans mon case, pour qu'il soit cohérent avec les données retournée du select principal? (le 411 n'est qu'un exemple parmis d'autre, le case doit être effectué pour chaque lignes retournée dans la requete principale!).
    Euh... là il faudrait la vraie requête parce que j'ai un peu de mal à comprendre !

    Je subodore une jointure quelque part mais il me faut plus de précision.

  6. #6
    Membre averti
    Avatar de onet
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    365
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2002
    Messages : 365
    Points : 344
    Points
    344
    Par défaut
    J'avance un peu. Il ne semble pas apprecier la sous requete:

    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
    45
    46
    47
    48
    select 
        `apaptalrqdsgh`.`company_airport_id` AS `company_airport_id`,
        `ap`.`sf_account` AS `company_airport_sf_account`,
        `ap`.`iata_code` AS `company_airport_iata_code`,
        `ap`.`name` AS `airport_name`,
        `apaptalrqdsgh`.`airport_terminal_id` AS `airport_terminal_id`,
        `apt`.`sf_account` AS `airport_terminal_sf_account`,
        `apt`.`name` AS `airport_terminal_name`,
        `bcat`.`name` AS `airport_terminal_color`,
        `apaptalrqdsgh`.`company_airline_id` AS `company_airline_id`,
        `al`.`sf_account` AS `company_airline_sf_account`,
        `al`.`iata_code` AS `company_airline_iata_code`,
        `al`.`name` AS `airline_name`,
        `bcal`.`name` AS `airline_color`,
        `apaptalrqdsgh`.`reader` AS `reader`,
        `apaptalrqdsgh`.`bcbp_read` AS `bcbp_read_capable`,
        `apaptalrqdsgh`.`printer` AS `printer`,
        `apaptalrqdsgh`.`bcbp_print` AS `bcbp_print_capable`,
        `apaptalrqdsgh`.`request_id` AS `request_id`,
        `rq`.`req_status` AS `request_status`,
        `rq`.`bcbp_live_date` AS `request_live_date`,
        `apaptalrqdsgh`.`equipment_dcs_id` AS `equipment_dcs_id`,
        `ds`.`name` AS `dcs_name`,
        `apaptalrqdsgh`.`company_ground_handler_id` AS `company_ground_handler_id`,
        `gh`.`short_name` AS `ground_handler_name`,
        `al`.`bcbp_scope` AS `airline_scope`,
        `country`.`iso` AS `airline_sf_coutry_iso`,
        `country`.`name` AS `airline_sf_coutry_name`,
        `country`.`region` AS `airline_sf_region`, 
        IF(SUM(
                    SELECT is_active
                    FROM admin_by_airport
                    LEFT JOIN contact ON contact.id = admin_by_airport.contact_id
                        LEFT JOIN sf_guard_user ON contact.user_id = sf_guard_user.id
                    WHERE admin_by_airport.company_id =411
                    ) > 1, 1,0) as toto 
     
        from 
            `flies_to` `apaptalrqdsgh` 
            left join `company_airport` `ap` on `apaptalrqdsgh`.`company_airport_id` = `ap`.`id` 
                left join `airport_terminal` `apt` on `apaptalrqdsgh`.`airport_terminal_id` = `apt`.`id`
                    left join `company_airline` `al` on `apaptalrqdsgh`.`company_airline_id` = `al`.`id`
                        left join `country` on `al`.`country_id` = `country`.`id`
                            left join `bcbp_color` `bcal` on `al`.`bcbp_color_id` = `bcal`.`id` 
                             left join `bcbp_color` `bcat` on `apt`.`bcbp_color_id` = `bcat`.`id` 
                                left join `request` `rq` on `apaptalrqdsgh`.`request_id` = `rq`.`id` 
                                    left join `equipment_dcs` `ds` on `apaptalrqdsgh`.`equipment_dcs_id` = `ds`.`id`
                                        left join `company_ground_handler` `gh` on `apaptalrqdsgh`.`company_ground_handler_id` = `gh`.`id`
    Si je remplace le SUM() par 2 ou 1, par exemple, ca fonctionne parfaitement. Mais si je mets le sum, il me renvois:
    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT is_active FROM admin_by_airport LEFT JOIN contact ON contact.id =' at line 31
    Une idée du pourquoi?

    Merci

    Onet

  7. #7
    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 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Essaie plutôt comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CASE
      WHEN (SELECT SUM(is_active) ...) > 1...
    Sinon il doit y avoir moyen de faire une ou des jointures supplémentaires - celles qui sont dans la sous-requête - pour relier chaque company_id mais vu la complexité de la requête, je n'ai pas trop le temps de chercher maintenant.
    Je te laisse ce plaisir.

  8. #8
    Membre averti
    Avatar de onet
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    365
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2002
    Messages : 365
    Points : 344
    Points
    344
    Par défaut
    Héhé

    Ouaip, je venais de trouver cette info a l'instant.

    me reste plus qu'a faire la liaison entre la sous-requete et la requete principale, lol :s

    Merci

    Olivier

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

Discussions similaires

  1. Sous - sous - requete SQL
    Par janjannaj dans le forum Bases de données
    Réponses: 1
    Dernier message: 19/04/2011, 08h21
  2. Sous requetes SQL
    Par Invité dans le forum Requêtes
    Réponses: 3
    Dernier message: 02/09/2009, 19h22
  3. sous requete SQL
    Par Invité dans le forum Langage SQL
    Réponses: 48
    Dernier message: 02/01/2007, 12h32
  4. Plusieurs sauvegardes d'une sous-requete SQL
    Par at_first dans le forum Requêtes et SQL.
    Réponses: 16
    Dernier message: 04/12/2006, 17h52
  5. Sous-requetes SQL Oracle MsQUERY
    Par CHRISTOPHE_86 dans le forum Oracle
    Réponses: 1
    Dernier message: 11/09/2006, 20h45

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