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 :

[requête]donner résultat que si + de n lignes...


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2002
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 35
    Points : 36
    Points
    36
    Par défaut [résolu][requête]donner résultat que si + de n lignes...
    Bonjour,

    Je travaille actuellement sur une requête et j'aurai besoin de vos lumières. Je précise que je ne veux pas utiliser de pl/SQL (trop peu de gens capables de maintenir ça chez moi).
    J'ai une table 'toto' et une table 'tata' dans lesquelles je vais chercher des données avec la requête suivante :

    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   ('!! texte!! ' 
    	   || att1) as c1, (' ' ||'  '|| att2) as c2
       FROM
          toto toto1,
          tata
       WHERE
              att2 = 'Y'
       AND
               att3 > 0
       AND tata.att4='texte'
       AND   EXISTS
          (    SELECT 'found' 
               FROM   toto toto2
               WHERE  toto1.att2=toto2.att2
               AND    toto1.att3=toto2.att3
               AND    toto2.att5=truc
          )
    Je voudrais que la requête ne me renvoie des données que si le nombre de lignes est supérieur à un nombre donné...

    Aidez-moi pleeeeeeeeaaaaaaaaaaase......

    J'ai essayé des count dans tous les sens, des sum(count) etc rien ne marche....

  2. #2
    Membre actif
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mars 2002
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mars 2002
    Messages : 192
    Points : 252
    Points
    252
    Par défaut
    Bon déja tu aurais pu simplifier le problème avec une requete plus simple et surtout plus compréhensible.

    Essaie comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT 
        EMPNO
    FROM 
        EMP
    WHERE
        SIGN((SELECT COUNT(*) FROM EMP) - MIN_LIGNE_A_RAMENER) >= 0
    Où tu remplace MIN_LIGNE_A_RAMENER par ta valeur pivot.

    Au fait, il y a peut-être plus propre

    McFoggy

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    Déjà tu as un pb dans ta sous requête...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WHERE  toto1.att2=toto2.att2
    mais dans la clause FROM tu ne déclares pas de toto1 !!

    Si je ne me trompe pas une sous requête c une requête à part entière donc tu ne peux pas utilisé le toto1 de la requête principale !!

  4. #4
    Nouveau membre du Club
    Inscrit en
    Mai 2002
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 35
    Points : 36
    Points
    36
    Par défaut
    Pour le truc de la sous-requête, ça marche trés bien sous orcale 8i avec une connexion sqlplus....

    Pour l'autre réponse, je ne peux pas faire plsu simple parce que le données sont fournies par un truc qui s'appelle Gold et qui n'est pas du tout standardisé... Les trucs que je dois récupérer sont à droite et à gauche c la requête la plus simple que j'ai pu faire il y en a des centaines comme ça dans ma base....

    Je vais essayer qd meme ta solution...

  5. #5
    Membre actif
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mars 2002
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mars 2002
    Messages : 192
    Points : 252
    Points
    252
    Par défaut
    Citation Envoyé par Sir Tengu
    Si je ne me trompe pas une sous requête c une requête à part entière donc tu ne peux pas utilisé le toto1 de la requête principale !!
    Si il peut, c'est pas le pb là.

    Quand tu me dis que tu ne pas simplifier, j'espère que tu rigoles.
    Je te donne bien une réponse en ayant simplifié ton problème.

    McFoggy

  6. #6
    Nouveau membre du Club
    Inscrit en
    Mai 2002
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 35
    Points : 36
    Points
    36
    Par défaut
    Bah je comprends pas il me renvoie toujours les résultats même si le nombre de lignes est inférieur à celui que j'ai spécifié

  7. #7
    Membre actif
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mars 2002
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mars 2002
    Messages : 192
    Points : 252
    Points
    252
    Par défaut
    Oups je m'emporte là.

    voilà que je dis de grosses bétises.

    Je corrige ds 2 minutes

  8. #8
    Nouveau membre du Club
    Inscrit en
    Mai 2002
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 35
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par McFoggy
    Quand tu me dis que tu ne pas simplifier, j'espère que tu rigoles.
    Je te donne bien une réponse en ayant simplifié ton problème.
    McFoggy
    En fait, je pensais que le pb venait de la complexité de la requête.... Par exemple avec des colonnes de ce type ('!! texte!! ' || att1) j'ai du mal à faire des group by sous oracle il dit que le nom de colonne est invalide lorsque j'utilise l'alias que j'ai défini...

    C'est pour cette raison quer je n'avais volontairement pas simplifié ma requête...

    D'un autre côté, j'ai bien essayé ta solution mais elle ne marche pas... Il ne m'affiche aucune erreur mais il ne filtre pas sur le nombre de lignes...

  9. #9
    Membre actif
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mars 2002
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mars 2002
    Messages : 192
    Points : 252
    Points
    252
    Par défaut
    Citation Envoyé par Titia765
    Je voudrais que la requête ne me renvoie des données que si le nombre de lignes est supérieur à un nombre donné...
    c'est ce qui se passe :
    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
    scott@ltstd> SELECT COUNT(*) FROM EMP
      2  /
     
      COUNT(*)
    ----------
            14
     
    scott@ltstd>     
    scott@ltstd> SELECT 
      2      EMPNO 
      3  FROM 
      4      EMP 
      5  WHERE 
      6      SIGN((SELECT COUNT(*) FROM EMP) - 10) >= 0
      7  /
     
         EMPNO
    ----------
          7369
          7499
          7521
          7566
          7654
          7698
          7782
          7788
          7839
          7844
          7876
     
         EMPNO
    ----------
          7900
          7902
          7934
     
    14 ligne(s) sélectionnée(s).
     
    scott@ltstd> 
    scott@ltstd> SELECT 
      2      EMPNO 
      3  FROM 
      4      EMP 
      5  WHERE 
      6      SIGN((SELECT COUNT(*) FROM EMP) - 20) >= 0
      7  /
     
    aucune ligne sélectionnée
    McFoggy

  10. #10
    Nouveau membre du Club
    Inscrit en
    Mai 2002
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 35
    Points : 36
    Points
    36
    Par défaut
    Le problème de la simplification, c que cela masque d'autres problèmes. Je suis d'accord que dans le cas de la table emp la requête fonctionne sans pb. Mais si dans le from on a une sous-requête et non un table du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT 
        EMPNO 
    FROM 
        (SELECT EMPNO FROM EMP WHERE FILTRE='un') TOTO
    WHERE 
        SIGN((SELECT COUNT(*) FROM TOTO)-2) >= 0
    L'attribut filtre contient soit 'un' soit 'deux'. Pour mon test j'avais une ligne qui contenait 'deux' et 3 qui contenaient 'un'.
    Je sais qu'on pourrait reformuler cette requête autrement. Mais c'est parce que celle-ci est simple. Dans mon cas réel, je ne peux pas reformuler la requête (déjà parce qu'elle n'a pas été écrite par moi...)

    Dans le cas de cette requête, Oracle plante parce qu'il dit qu'il ne connaît pas la table Toto...

  11. #11
    Membre actif
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mars 2002
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mars 2002
    Messages : 192
    Points : 252
    Points
    252
    Par défaut
    Soit tu remplaces ton FROM TOTO par la définition de ton alias => recopie de la requête de définiton de l'alias, soit tu crées une vue à la place de ton alias.

    McFoggy

  12. #12
    Nouveau membre du Club
    Inscrit en
    Mai 2002
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 35
    Points : 36
    Points
    36
    Par défaut
    J'y avais bien pensé mais vu que ma requête dans le from fais pas mal de lignes je m'étais dit que au niveau optimisation c'était pas terrible... Pour le création de la vu, c vrai que c une bonne idée...

    Mais si sql ne permet pas d'utiliser les noms de tables définis comme alias dans la clause FROM (à part pour préfixer des attributs), pourquoi peut-on définir des alias de cette manière?

  13. #13
    Nouveau membre du Club
    Inscrit en
    Mai 2002
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 35
    Points : 36
    Points
    36
    Par défaut
    Encore un pb! La loi des séries!!!

    Je n'ai pas les droits pour créer des vues dans la base et on ne veut pas me les donner et on ne veut pas non plus me créer cette vue...

    Y a vraiment pas un autre moyen que de recopier la requête???

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

Discussions similaires

  1. Requête deux résultats sur une même ligne
    Par delaio dans le forum Langage SQL
    Réponses: 4
    Dernier message: 12/02/2012, 12h10
  2. Réponses: 2
    Dernier message: 25/04/2011, 12h23
  3. Requête pour résultats sur une seule ligne
    Par jobine2011 dans le forum Développement
    Réponses: 3
    Dernier message: 05/01/2011, 17h06
  4. Réponses: 5
    Dernier message: 24/07/2006, 14h01
  5. Une chaîne, une requête, des résultats...
    Par tsing dans le forum Requêtes
    Réponses: 3
    Dernier message: 20/03/2005, 21h38

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