Précédent   Forum des professionnels en informatique > Bases de données > Firebird > SQL
SQL Forum d'entraide sur le SQL pour Firebird
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/05/2005, 17h50   #1
Membre confirmé
 
Luc BOLOGNA
Inscription : mai 2004
Messages : 185
Détails du profil
Informations personnelles :
Nom : Luc BOLOGNA

Informations forums :
Inscription : mai 2004
Messages : 185
Points : 205
Points : 205
Envoyer un message via MSN à /dev/null
Par défaut MetaModel et Multicolone

Bonjour... J'utilise une base de donné basé sur le principe des MetaModel. Mon problème principal vient du fait que toutes mes données sont dans une et une seul base. J'aimerais en effet sortir de cette même table (et champ ) deux champ different.
Pour chématiser, j'aimerais pouvoir avoir une requête de la forme
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT NOM
FROM   VALEURS
WHERE
       ((SELECT VALEURS.VALEUR AS NOM
         FROM   VALEURS
         INNER  JOIN DONNEES ON (DONNEES.ID_VALEUR = VALEURS.ID_VALEUR)
         WHERE
         ((DONNEES.ID_DESCR = -1) AND (DONNEES.ID_LIGNE IN (1)))
       )
       AND
        (SELECT VALEURS.VALEUR AS PRENOM
         FROM   VALEURS
         INNER  JOIN DONNEES ON (DONNEES.ID_VALEUR = VALEURS.ID_VALEUR)
         WHERE
         ((DONNEES.ID_DESCR = -2) AND (DONNEES.ID_LIGNE IN (1)))
        )
       )
Vous voillez ? En fait j'ai besoin de faire dans une requête, deux requête, et de stoké le tout dans deux alias...
Si quelqu'un a une idée... Je cherche depuis bien trois semaine
__________________
De toutes les choses que j'ai perdue,
Celle qui me manque le plus...
c'est mon esprit !
/dev/null est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2005, 18h48   #2
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
La clause where principale comporte (SELECT...) and (SELECT...), il n'y a pas de test juste des selects...

Vous voulez récupérer le nom et prémon de plusieurs moyens par exemple :

Code :
1
2
3
4
5
SELECT VALEURS.VALEUR, DONNEES.ID_DESCR
         FROM   VALEURS 
         INNER  JOIN DONNEES ON (DONNEES.ID_VALEUR = VALEURS.ID_VALEUR) 
         WHERE 
         (DONNEES.ID_DESCR IN ( -1, -2 ) AND (DONNEES.ID_LIGNE = 1 ))
Si vous êtes sous FB1.5 vous pouvez même faire un :

Code :
1
2
3
4
5
6
7
8
9
SELECT VALEURS.VALEUR, CASE DONNEES.ID_DESCR 
      WHEN -1 THEN 'NOM'
      WHEN -2 THEN 'PRENOM'
      ELSE '??'
    END AS ALIAS
         FROM   VALEURS 
         INNER  JOIN DONNEES ON (DONNEES.ID_VALEUR = VALEURS.ID_VALEUR) 
         WHERE 
         (DONNEES.ID_DESCR IN ( -1, -2 ) AND (DONNEES.ID_LIGNE = 1 ))
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2005, 09h18   #3
Membre confirmé
 
Luc BOLOGNA
Inscription : mai 2004
Messages : 185
Détails du profil
Informations personnelles :
Nom : Luc BOLOGNA

Informations forums :
Inscription : mai 2004
Messages : 185
Points : 205
Points : 205
Envoyer un message via MSN à /dev/null
C'est pas loing... est c'est déjà une chose que je ne savais pas... mais le vrai but final est d'obtenir les ID_DESC = -1 dans NOM et les ID_DESC = -2 dans PRENOM.
J'aimerais fusionner c'est deux requêtes:
Code :
1
2
3
4
SELECT VALEURS.VALEUR AS NOM
FROM   VALEURS
  INNER  JOIN DONNEES ON (DONNEES.ID_VALEUR = VALEURS.ID_VALEUR)
WHERE ((DONNEES.ID_DESCR = -1) AND (DONNEES.ID_LIGNE IN (1, 2)))
Code :
1
2
3
4
SELECT VALEURS.VALEUR AS PRENOM
FROM   VALEURS
  INNER  JOIN DONNEES ON (DONNEES.ID_VALEUR = VALEURS.ID_VALEUR)
WHERE ((DONNEES.ID_DESCR = -2) AND (DONNEES.ID_LIGNE IN (1, 2)))
Elles utilisent toutes les deux des données de la table VALEURS en sortie. Mais elles ne corespondent pas à la même chose en fait. Tu aurais encore une ou deux idées .

Pour information, je suis sous IB6

Mercie pour ta reponse
__________________
De toutes les choses que j'ai perdue,
Celle qui me manque le plus...
c'est mon esprit !
/dev/null est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2005, 10h44   #4
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Je me doutais que vous le vouliez dans deux colonnes séparées.

Mais quel est l'interret ?? Pour moi ce n'est que de la "présentation" et la présentation ce n'est pas le but d'un serveur de données mais plutot le role du programme client.

Cependant il est possible de les mettre en colonne mais la requete sera bien plus lourde à écrire surtout si vous voulez plus de 2 colonnes.

Code :
1
2
3
4
5
6
7
SELECT V1.VALEUR AS nom, v2.Valeur AS prenom
         FROM  DONNEES D1
         INNER JOIN DONNEES D2 ON (D2.id_ligne=D1.id_ligne)
         INNER  JOIN VALEURS V1 ON (D1.ID_VALEUR = V1.ID_VALEUR AND D1.id_descr=-1)
         INNER JOIN valeurs v2 ON (D2.id_valeur= V2.id_valeur  AND D2.id_descr=-2)
         WHERE 
         (D1.ID_LIGNE = 1)
Voilà il faut adapté bien entendu les jointures en fonction des données. Si par exemple le prénom n'est pas obligatoire et donc qu'il n'y a pas de id_descr = -2 la requete ci dessus ne retournera rien (même pas le nom...) Il faut mettre un left join devant les données optionnelles.

Voilà vous voyez que tout dessuite on se retrouve avec une requete qui avant n'avait qu'une seule jointure et une présentation en ligne à une requete à 4 jointures pour une présentation en colonne.
Si vous voulez une 3eme données en colonne vous allez passer à 6 jointures etc... Alors que la première requete reste à 2 quelques soit le nombre de valeur.

Sinon il reste l'option de la PS qui pourra faire la présentation un peu plus facilement.
Code :
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
SET term ^;
 
CREATE PROCEDURE MES_DONNES(ID_LIGNE INTEGER)
RETURNS (
    NOM VARCHAR(50),
    PRENOM VARCHAR(50))
AS
declare variable VALEUR VARCHAR(50);
declare variable ID_DESCR INTEGER;
BEGIN
  NOM = NULL;
  PRENOM = NULL;
  FOR
    SELECT VALEURS.VALEUR, DONNEES.ID_DESCR
         FROM   VALEURS 
         INNER  JOIN DONNEES ON (DONNEES.ID_VALEUR = VALEURS.ID_VALEUR) 
         WHERE 
         (DONNEES.ID_DESCR IN ( -1, -2 ) AND (DONNEES.ID_LIGNE = :ID_LIGNE ))
    INTO :VALEUR, :ID_DESCR
  DO
  BEGIN
    IF (ID_DESCR=-1) then NOM = VALEUR;
    IF (ID_DESCR=-2) then PRENOM = VALEUR;
  END
  SUSPEND;
END^
 
SET term ;^
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2005, 11h08   #5
Membre confirmé
 
Luc BOLOGNA
Inscription : mai 2004
Messages : 185
Détails du profil
Informations personnelles :
Nom : Luc BOLOGNA

Informations forums :
Inscription : mai 2004
Messages : 185
Points : 205
Points : 205
Envoyer un message via MSN à /dev/null
C'est vraie que la présentation n'est pas trop le rôle de la BDD... en fait je voulais essayer de trouver une méthode me permettant d'obtenir une version de mes MetaTable de façon a remplir un DataSet... Et je croi qu'au niveau présentation, il n'on pas grand chose de disponible
Merci ennormement pour cette dernière réponse qui m'a fait voir le nombre de lacune que j'ai
__________________
De toutes les choses que j'ai perdue,
Celle qui me manque le plus...
c'est mon esprit !
/dev/null est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h34.


 
 
 
 
Partenaires

Hébergement Web