Vous n'êtes pas identifié(e).

#1 10/08/2012 10:33:32

llanowars
Membre

Table temporaire + jointure

Bonjour,

Je vous écris car j'ai un problème.
Impossible de créer une table temporaire dans ma requête, mais au lieu de faire un long discours je vous écris ma requête:

SELECT
  a, b, c, toto.d
FROM
  table_a
INNER JOIN table_b on .....
INNER JOIN table_c on ......
INNER JOIN table as toto on toto.d = (
  SELECT CASE
     WHEN condition_1 THEN (SELECT e FROM table_e WHERE condition_e)
     WHEN condition_2 THEN (SELECT f  FROM table_f WHERE condition_f)
     WHEN condition_3 THEN (SELECT g FROM table_g WHERE condition_g)
     WHEN condition_4 THEN (SELECT h FROM table_h WHERE condition_h)
  END)

GROUP BY a, b, c, toto.d

Lors de l'éxécution de celle ci, j'ai cette erreur:

ERROR:  aggregates not allowed in JOIN conditions

********** Erreur **********

ERROR: aggregates not allowed in JOIN conditions
État SQL :42803

Elle me dit que je n'ai pas le droit de faire des jointures pour créer ma table temporaire.
La seule solution que j'ai trouvé c'est de mettre le CASE dans le SELECT.

SELECT
  a, b, c,
  CASE
     WHEN condition_1 THEN (SELECT e FROM table_e WHERE condition_e)
     WHEN condition_2 THEN (SELECT f  FROM table_f WHERE condition_f)
     WHEN condition_3 THEN (SELECT g FROM table_g WHERE condition_g)
     WHEN condition_4 THEN (SELECT h FROM table_h WHERE condition_h)
  END AS toto.d
FROM
  table_a
INNER JOIN table_b on .....
INNER JOIN table_c on ......

Mais je n'aime pas trop cette solution hmm

Si vous avez des idées je suis preneur car je n'ai rien trouvé sur le net.
Merci,

PS: Je debute en BDD.

Hors ligne

#2 10/08/2012 11:30:58

gleu
Administrateur

Re : Table temporaire + jointure

Elle me dit que je n'ai pas le droit de faire des jointures pour créer ma table temporaire.

Pas du tout, le message indique que vous n'avez pas le droit de faire des agrégats dans une jointure. Comme vous avez tout détaillé sauf la requête de la jonction, difficile d'aller plus loin. La seule chose que je peux dire, c'est que vos deux requêtes ne sont pas équivalentes.


Guillaume.

Hors ligne

#3 10/08/2012 14:49:49

llanowars
Membre

Re : Table temporaire + jointure

Donc en fait cela vient de la fonction SUM que j'utilise dans mon INNER JOIN

Voici m'a requête:

SELECT
  a, b, c, toto.d
FROM
  table_a
INNER JOIN table_b on .....
INNER JOIN table_c on ......
INNER JOIN table as toto on 
    toto.champs = (
        SELECT CASE
        WHEN (SUM (greatest (b.champs_1, b.champs_2, b.champs_3, b.champs_4))) = SUM (b.champs_1)
            THEN (SELECT id FROM table_x WHERE id = 'b.champs_1')
        WHEN (SUM (greatest (b.champs_1, b.champs_2, b.champs_3, b.champs_4))) = SUM (b.champs_2)
            THEN (SELECT id FROM table_x WHERE id = 'b.champs_2')
        WHEN (SUM (greatest (b.champs_1, b.champs_2, b.champs_3, b.champs_4))) = SUM (b.champs_3)
            THEN (SELECT id FROM table_x WHERE id = 'b.champs_3')
        ELSE (SELECT id FROM table_x WHERE id = 'b.champs_4')
        END
GROUP BY a, b, c, toto.d

Donc si je comprend bien, il faudrait utiliser un HAVING pour contourner cette erreur.

Hors ligne

Pied de page des forums