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 :

Comment faire une double requête sur une table


Sujet :

Langage SQL

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Points : 488
    Points
    488
    Par défaut Comment faire une double requête sur une table
    Bonjour.


    Je cherche à faire un select, certainement simple pour vous les pros, mais qui me freeze le cerveau

    J'ai deux tables assez simples (j'ai simplifié le code si dessous au max hein !):
    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
    CREATE TABLE "Items"
    (
      "ITEM_ID" integer,
      "NAME" text UNIQUE
    );
     
    CREATE TABLE "ItemLinks"
    (
      "TRUNK_ID" integer,
      "LINKED_ID" integer,
      CONSTRAINT "ItemLinks_LINKED_REF"
        FOREIGN KEY ("LINKED_ID")
        REFERENCES "ItemDatas" ("ID") MATCH SIMPLE,
      CONSTRAINT "ItemLinks_TRUNK_REF"
        FOREIGN KEY ("TRUNK_ID")
        REFERENCES "ItemDatas" ("ID") MATCH SIMPLE
    );
    Problème : la table ItemLinks est humainement illisible.
    Je voudrais donc faire une vue de ce style, mais évidement, ça ne fonctionne pas.

    Notez que je place deux fois les mêmes colonnes dans mon select mais sous des alias différents, et c'est la où je bloque en fait.
    Tout est censé (dans mon esprit ) se jouer dans le WHERE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT "Items"."Name" AS trunkname,
           "Items"."ITEM_ID" as trunkid,
           "Items"."NAME" AS lnkname,
           "Items"."ITEM_ID" AS lnkid
      FROM public."Items",
           public."ItemLinks"
     WHERE trunkid = public."ItemLinks"."TRUNK_ID"
       AND lnkid = public."ItemLinks"."LINKED_ID";
    La requête me jete au niveau du WHERE en disant que la colone trunkid n'existe pas

    Pourriez-vous me dire ce qu'il faut faire en fait?

    un Grand MERCI d'avance

  2. #2
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    Tu ne peux pas utiliser dans le WHERE les alias définis dans le SELECT !
    remplace par "Items"."ITEM_ID", je dirais...

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Points : 488
    Points
    488
    Par défaut
    Oui mais tout le probleme justement, réside dans le fait que place 2 fois "Items"."ITEM_ID dans mon select, donc comment dire au where que le Premier doit etre egal à "ItemLinks"."TRUNK_ID" et le second à "ItemLinks"."LINK_ID" ?

  4. #4
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Ah, mais en fait tu veux lier deux lignes différentes de la table items ?

    Dans ce cas là, il faut que tu la mettes de fois dans le FROM, avec deux alias différents... et après, tu lies sur l'alias correspondant.

    Tu vois ?

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Points : 488
    Points
    488
    Par défaut
    Citation Envoyé par pacmann Voir le message
    Ah, mais en fait tu veux lier deux lignes différentes de la table items ?
    Oui.

    Dit autrement, je cherche à décorer ma table ITEM_LINK avec des informations de ma table ITEMS. Créer une vue humainement explicite.

    Citation Envoyé par pacmann Voir le message
    Dans ce cas là, il faut que tu la mettes de fois dans le FROM, avec deux alias différents... et après, tu lies sur l'alias correspondant.

    Tu vois ?
    Je crois avoir compris, quelque chose comme :

    SELECT t1."NAME", t2."NAME" FROM "ITEMS" AS t1, "ITEMS" AS t2

    Si j'ai compris juste. Un Grand Merci pour ton aide, je repasserai apres test cloturer ce topic. Sinon ... a tout de suite

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Points : 488
    Points
    488
    Par défaut
    Excellent, ca fonctionne !

    En plus je pense avoir compris la philosophie de la chose, pourquoi ça ne pouvait pas fonctionner.

    Un Grand Merci !

    Juste une dernière question : est-ce que cette requête va faire deux fois un select sur ma table "Items" ?
    Je me pose cette question en terme de performances...

  7. #7
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Oui, ton SGBD va accéder deux fois à la table.

    Cela dit, d'une part tu n'as pas vraiment le choix, d'autre part si tu as des problèmes de performances, ça doit forcément pouvoir se régler !

    PS : on pourrait imaginer une autre requête, mais ça m'étonnerait que ça performe mieux.
    Genre faire les deux types de liaison en une fois avec un OR comme prédicat de jointure, puis faire un GROUP BY...

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

Discussions similaires

  1. Double requête sur une table
    Par sub-0 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 18/11/2010, 16h03
  2. Comment faire un lien relatif sur une balise link?
    Par Nixar dans le forum Balisage (X)HTML et validation W3C
    Réponses: 11
    Dernier message: 02/11/2008, 11h11
  3. Réponses: 1
    Dernier message: 10/10/2008, 16h23
  4. Réponses: 3
    Dernier message: 07/08/2008, 19h07
  5. comment faire fonctionner l'exe sur une autre machine
    Par brian79 dans le forum C++Builder
    Réponses: 8
    Dernier message: 28/05/2004, 14h00

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