Discussion: à quoi sert ce +

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    novembre 2009
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : novembre 2009
    Messages : 56
    Points : 48
    Points
    48

    Par défaut à quoi sert ce +

    Bonjour,

    je viens de tomber sur une requête qu'une ancienne collègue à faite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     SELECT v.ctry, v.vendorid, v.vendor, company, a.addressid, street1, street2, city
     FROM vendor v, ctry c, address a
     WHERE 1=1 
         AND v.ctry = c.ctry
         AND v.vendorid = a.vendorid
         AND v.vendorid || '-' || +addressid IN
         (  
                SELECT vendorid || '-' || MAX (addressid) maxaddress
                FROM address
                GROUP BY vendorid
        );
    je comprend pas à quoi peut servir le "+" en rouge.

    je connais la notation (+) qui sert à faire un join , donc j'aurais compris qqch du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ...
         AND v.vendorid = a.vendorid (+)
    ...

    mais là je vois pas.


    Une idée ?

    merci d avance

    L.

  2. #2
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    juillet 2003
    Messages
    4 005
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : juillet 2003
    Messages : 4 005
    Points : 6 278
    Points
    6 278
    Billets dans le blog
    3

    Par défaut

    Bonjour,

    Il s'agit de la façon de gérer les jointures externe.
    Equivalent à un OUTER JOIN
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB

  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    août 2008
    Messages
    2 600
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2008
    Messages : 2 600
    Points : 5 016
    Points
    5 016

    Par défaut

    Si la requête est vraiment écrite comme ça, je pensais qu'elle ne compilerai pas, mais il semble que le + soit considéré comme le signe du nombre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SQL> with t as (
    select 1 as c1, 2 as c2 from dual
    )
    select c1 ||'-'|| +c2 from t;
     
    C1|
    ---
    1-2
     
    SQL>
    Dans le code présenté, il semble bien inutile puisque dans le IN le + n'est pas utilisé associé au MAX.

    (+) (avec parenthèse) est une syntaxe oracle pour des jointures externes, comme l'a rappelé MCM.

  4. #4
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    juillet 2003
    Messages
    4 005
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : juillet 2003
    Messages : 4 005
    Points : 6 278
    Points
    6 278
    Billets dans le blog
    3

    Par défaut

    Houla, j'avais mal lu la question.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Ingénieur d'études décisionnel
    Inscrit en
    mai 2002
    Messages
    7 409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 7 409
    Points : 22 428
    Points
    22 428

    Par défaut

    A mon avis, l'unique intérêt de la chose est que, si addressid n'est pas un nombre valide, la requête tombera en erreur.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    novembre 2009
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : novembre 2009
    Messages : 56
    Points : 48
    Points
    48

    Par défaut

    merci McM et skuatamad il est toujours bon en effet de la rappeler ... le (+) est un join ah mais je suis bete je l'avais écrit dans mon post.

    et oui la requête est vraiment écrite comme ca et oui elle compile très bien . c'est le script d'une view.

    merci pour vos réponse tout de meme

  7. #7
    Expert confirmé
    Avatar de pachot
    Homme Profil pro
    Oracle ACE Director, DBA OCM 12c, consultant. En Suisse (dbi services)
    Inscrit en
    novembre 2007
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Suisse

    Informations professionnelles :
    Activité : Oracle ACE Director, DBA OCM 12c, consultant. En Suisse (dbi services)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2007
    Messages : 1 562
    Points : 5 417
    Points
    5 417
    Billets dans le blog
    5

    Par défaut

    Bonjour,
    Citation Envoyé par al1_24 Voir le message
    A mon avis, l'unique intérêt de la chose est que, si addressid n'est pas un nombre valide, la requête tombera en erreur.
    Ca passe avec un varchar:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SQL> select +dummy from dual;
     
     
    D
    -
    X
    Je pense que ce + est complètement inutile.

    Ce SQL est très mal écrit. Pourquoi faire une concaténation avec '-' ? il suffit de faire: AND (v.vendorid,addressid) IN ( SELECT vendorid,MAX (addressid) maxaddress)

    Et cette sous-requête est elle aussi inutile, et couteuse. Il faut utiliser la fonction analytique max(addressid)over(partition by v.vendorid)

    Cordialement,
    Franck
    Franck Pachot - Consultant et formateur (dbi services) - Oracle ACED - Oracle Certified Master 12c - Oak Table member - twitter: @FranckPachot
    Besoin d'une formation Oracle 12cR2 ?


  8. #8
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    novembre 2009
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : novembre 2009
    Messages : 56
    Points : 48
    Points
    48

    Par défaut

    Merci beaucoup Franck,

    également pour ces deux conseils .

  9. #9
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    novembre 2009
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : novembre 2009
    Messages : 56
    Points : 48
    Points
    48

    Par défaut

    par contre je ne comprends pas comment je peux me passer de la sous requête ?!

    je comprends que je peux utiliser la fonction analytique plutôt que de faire un group by avec max, mais comment se passer de la sous requête ?

    si j'ai besoin de prendre l'address qui a l'id le plus grand

  10. #10
    Modérateur

    Homme Profil pro
    Ingénieur d'études en décisionnel
    Inscrit en
    septembre 2008
    Messages
    7 432
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en décisionnel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : septembre 2008
    Messages : 7 432
    Points : 15 715
    Points
    15 715

    Par défaut

    Essayez comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      select max(v.ctry)   keep (dense_rank first order by a.addressid desc) as ctry
           , v.vendorid
           , max(v.vendor) keep (dense_rank first order by a.addressid desc) as vendor
           , max(company)  keep (dense_rank first order by a.addressid desc) as company
           , max(a.addressid)                                                as addressid
           , max(street1)  keep (dense_rank first order by a.addressid desc) as street1
           , max(street2)  keep (dense_rank first order by a.addressid desc) as street2
           , max(city)     keep (dense_rank first order by a.addressid desc) as city
        from vendor  v
        join ctry    c on c.ctry     = v.ctry
        join address a on a.vendorid = v.vendorid
    group by v.vendorid;

  11. #11
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    novembre 2009
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : novembre 2009
    Messages : 56
    Points : 48
    Points
    48

    Par défaut

    merci beaucoup ,

    l’exécution plan donne des résultats impressionnants d'efficacité .

  12. #12
    Modérateur

    Homme Profil pro
    Ingénieur d'études en décisionnel
    Inscrit en
    septembre 2008
    Messages
    7 432
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en décisionnel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : septembre 2008
    Messages : 7 432
    Points : 15 715
    Points
    15 715

    Par défaut

    Le plan d'exécution c'est une chose, il faut voir si ça se comporte bien dans votre environnement.

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

Discussions similaires

  1. A quoi sert XML-Schema
    Par Community Management dans le forum Valider
    Réponses: 20
    Dernier message: 26/01/2009, 09h52
  2. à quoi sert le délestage?
    Par r0d dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 5
    Dernier message: 06/10/2004, 14h34
  3. a quoi sert le schema dans postgres ??
    Par champion dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 13/09/2004, 10h25
  4. [info] A quoi sert ImageObserver ?
    Par FrigoAcide dans le forum AWT/SWING
    Réponses: 4
    Dernier message: 22/03/2004, 17h20

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