PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

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

#1 16/08/2017 12:16:55

HELP - Requete posant problème

Bonjour,

Je ne suis pas du tout experte sql mais je dois utiliser ce langage afin de mettre en place des rapoorts sur des etat comptables, de vente etc...
Aujourd'hui je bloque sur cette requête somme toute simple, mais pour laquelle il me manque quelques clés pou avoir des résultats cohérents.
La requete est la suivante :

ELECT
a.create_date AS date_de_vente,
a.original_list_price AS PRIX_TTC,
a.qty AS Quantite,
b.barcode,
c.name AS Nom_IMEI,
d.customer_number,
d.payment_code_display,
d.state AS Statut,
e.lastname AS Vendeur,
f.name AS produit,
CASE
WHEN (a.lot_id IS NOT NULL) AND (a.lot_id = c.id) THEN c.name
ELSE b.name_template

END AS name
FROM pos_order_line AS a,  product_product AS b, stock_production_lot AS c, pos_order AS  d, res_users AS e, product_template AS f
WHERE a.order_id = d.id AND d.user_id = e.id AND c.product_id = b.id AND (b.product_tmpl_id = f.id OR a.lot_id = c.id)
ORDER BY a.create_date ASC;

Lorsque je laisse cette condition : a.lot_id = c.id : je ne dispose que des produits de types terminaux (lot_id = IMEI)
Lorsque je l'enlève, la requête semble effectuer un produit cartésien qui me remonte des résultats naturellement incohérents.
Quelqu'un peut-il m'aider à voir ce qui cloche dans cette requête? Je sais que je ne devrais pas mettre toutes mes jointures dans la clause WHERE, mais j'ai du mal à trouver la syntaxe correcte des JOIN avec POSTGRES.
Merci pour votre aide et votre indulgence smile

Hors ligne

#2 16/08/2017 12:28:25

rjuju
Administrateur

Re : HELP - Requete posant problème

Essayez de d'abord arriver à faire des jointures expicites avant d'aller plus loin.  Quel problème rencontrez-vous pour l'utilisation d'un JOIN ?

Hors ligne

#3 16/08/2017 12:31:23

Re : HELP - Requete posant problème

j'ai toujours le message :

ERROR:  syntax error at or near "ON"
LINE 15: ...r_id = pos_order.id), JOIN (stock_production_lot (ON pos_ord...
                                                              ^
********** Error **********

ERROR: syntax error at or near "ON"
SQL state: 42601
Character: 519

Hors ligne

#4 16/08/2017 13:38:23

gleu
Administrateur

Re : HELP - Requete posant problème

Il ne faut pas de parenthèse avant le nom de la table jointe.


Guillaume.

Hors ligne

#5 16/08/2017 14:24:47

rjuju
Administrateur

Re : HELP - Requete posant problème

Pour être un peu plus précis, la parenthèse signifie que que vous ne joignez pas une table mais une sous requête. Donc ces deux syntaxes sont possibles :

SELECT * FROM t1 JOIN t2 ON ...
ou
SELECT * FROM t1 JOIN (SELECT ... FROM ...) AS t2 ON ...

Hors ligne

#6 16/08/2017 14:31:05

Re : HELP - Requete posant problème

j'essaie avec parenthèses, sans parenthèses mais rien 'y fait ... Je pense que le "OR" sème la zizanie ...
Je n'arrive pas à avoir une requète performante sad

Hors ligne

#7 16/08/2017 15:01:24

gleu
Administrateur

Re : HELP - Requete posant problème

Il y a une différence entre un problème de performance et un problème de syntaxe. Il serait bien de corriger les problèmes les uns à la suite des autres, ou on y arrivera jamais. Quel est votre problème ? et merci de détailler qu'on puisse comprendre ce qu'il se passe smile


Guillaume.

Hors ligne

#8 16/08/2017 15:53:04

rjuju
Administrateur

Re : HELP - Requete posant problème

Il y a au minimum une virgule en trop avant le JOIN.  Et sinon oui, merci de fournir la requête complète ainsi que le message d'erreur complet.

Hors ligne

#9 16/08/2017 18:57:36

dverite
Membre

Re : HELP - Requete posant problème

Princesse_Tamtam a écrit :

Lorsque je laisse cette condition : a.lot_id = c.id : je ne dispose que des produits de types terminaux (lot_id = IMEI)
Lorsque je l'enlève, la requête semble effectuer un produit cartésien qui me remonte des résultats naturellement incohérents.

La requête cherche visiblement a gérer le cas où a.lot_id est NULL et simultanément le cas où il ne l'est pas.
D'où cette condition:
   (b.product_tmpl_id = f.id OR a.lot_id = c.id)
qui a l'air d'exprimer le fait que quand a.lot_id n'est pas NULL il faut le joindre avec c.id (mais dans ce cas il va y avoir un produit cartésien avec les lignes de f), et dans le cas contraire là il faut joindre b avec f.

Autrement dit si s'il y a un lot il n'y a pas de produit et vice-versa.

Si c'est bien ça l'idée, il serait plus simple de faire deux requêtes séparées pour chacun des cas, sortant le même jeu de colonnes, et les relier avec une clause UNION ALL.

Hors ligne

#10 16/08/2017 23:03:24

Re : HELP - Requete posant problème

Merci infiniment pour cette réponse dverite. En effet, vous avez bien compris l'idée. Je vais tester dès demain vos recommandations et reviendrai pour vous faire part des résultats!

Hors ligne

Pied de page des forums