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

Oracle Discussion :

Compléter la requete Oracle par des nulls


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 24
    Par défaut Compléter la requete Oracle par des nulls
    Salut TLMONDE
    J'ai une colle pour vous amateurs de sql.
    J'aimerais savoir si il est possible de compléter une requête sql qui renvoie n enregistrements en m enregistrements avec m>n.
    Les (m-n) enregistrements qui complètent la requête doivent être nuls.

  2. #2
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 461
    Par défaut
    Citation Envoyé par pjcejbpojo
    Salut TLMONDE
    J'ai une colle pour vous amateurs de sql.
    J'aimerais savoir si il est possible de compléter une requête sql qui renvoie n enregistrements en m enregistrements avec m>n.
    Les (m-n) enregistrements qui complètent la requête doivent être nuls.
    Oui, pourquoi pas, il suffit d'utiliser un UNION ALL avec des NULL.

    Imaginons que vous voulez systématiquement 5 lignes nulles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select last_name, first_name
    from hr.employees
    where last_name like 'C%'
    union all
    select null, null 
    from hr.employees
    where rownum < 6;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Cabrio    Anthony
    Cambrault    Gerald
    Cambrault    Nanette
    Chen    John
    Chung    Kelly
    Colmenares    Karen
    (null)    (null)
    (null)    (null)
    (null)    (null)
    (null)    (null)
    (null)    (null)

  3. #3
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Par défaut
    Je ferais plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT *
    FROM (SELECT Last_Name, First_Name
          FROM Employees
        UNION ALL
          SELECT NULL, NULL
          FROM dual 
          CONNECT BY rownum <= 10
        ORDER BY 1, 2)
    WHERE rownum <= 10
    Le ORDER BY 1, 2 est là pour garantir que les lignes "pleines" seront prises en premier (mais dans le cas d'un UNION ALL c'est le cas, même sans le ORDER BY)

  4. #4
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    Citation Envoyé par Médiat
    Je ferais plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
          SELECT NULL, NULL
          FROM dual 
          CONNECT BY rownum <= 10
    moi je ne ferais jamais ça ! outre le fait que le nombre de lignes retournées n'est pas constant

    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
     
    SQL> select version from v$instance;
    VERSION
    -----------------
    10.1.0.3.0
    SQL> SELECT NULL, NULL FROM dual CONNECT BY rownum <= 10;
    N N
    - -
     
     
     
     
     
     
    11 rows selected.
    il est aussi illégal d'employer CONNECT BY sans clause PRIOR.

    Pour revenir au problème de l'utilisateur, d'où vient "m" ? Si c'est une variable, alors tu peux programmer une fonction PL/SQL qui retourne une table. Si m est le nombre de lignes dans une autre requête, alors un outer join fera sûrement l'affaire

  5. #5
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SQL> select version from v$instance;
    VERSION
    -----------------
    9.2.0.1.0
    SQL> SELECT NULL, NULL FROM dual CONNECT BY rownum <= 10;
    N N
    - -
     
     
     
     
     
    10 ligne(s) sélectionnée(s).
    Citation Envoyé par laurentschneider
    il est aussi illégal d'employer CONNECT BY sans clause PRIOR
    Et qu'est-ce que je risque si tu me dénonces ? J'avoue que je ne comprends pas bien cet argument...

  6. #6
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    pas grand chose

    mais ce n'est pas propre ... et ce n'est pas censé fonctionner.

    Citation Envoyé par sqlreference
    PRIOR
    In a hierarchical query, one expression in the CONNECT BY condition must be qualified by the PRIOR operator
    une hiérarchie connect by ne devrait pas avoir de boucles, et si boucle il y a, la requête devrait retourner ORA-01436: CONNECT BY loop in user data

    le fait que la requête retourne 10 lignes dans 9iR2, 11 lignes dans 10gR1 et 10 lignes dans 10gR2 atteste de sa non-fiabilité. Cependant, depuis que Mikito Harakiri a trouvé cette astuce et publié sur le site de tom kyte, des milliers d'utilisateurs en font usage.

    Bonne semaine
    Laurent

Discussions similaires

  1. [AC-2003] Remplacer les chaines vides (ZLS – Zero Lenght String) par des Null.
    Par Bonero dans le forum VBA Access
    Réponses: 2
    Dernier message: 12/03/2012, 17h34
  2. Ne pas remplacer les 0 par des NULL
    Par yamatoshi dans le forum Requêtes
    Réponses: 11
    Dernier message: 09/07/2010, 14h12
  3. Requeter ORACLE sans passer par un fichier .dqy
    Par ruzakruzak dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 13/02/2008, 10h36
  4. passer une requete ajout avec des enregitrement null
    Par LesLemmings dans le forum Requêtes et SQL.
    Réponses: 15
    Dernier message: 13/06/2006, 15h20
  5. [sgbd]Optimisation des requetes Oracle/Perl
    Par linou dans le forum SGBD
    Réponses: 7
    Dernier message: 30/06/2005, 18h09

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