Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#1 16/08/2017 12:16:55
- Princesse_Tamtam
- Membre
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
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 ?
Julien.
https://rjuju.github.io/
Hors ligne
#3 16/08/2017 12:31:23
- Princesse_Tamtam
- Membre
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 ...
Julien.
https://rjuju.github.io/
Hors ligne
#6 16/08/2017 14:31:05
- Princesse_Tamtam
- Membre
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
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
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.
Julien.
https://rjuju.github.io/
Hors ligne
#9 16/08/2017 18:57:36
- dverite
- Membre
Re : HELP - Requete posant problème
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.
@DanielVerite
http://blog-postgresql.verite.pro/
Hors ligne
#10 16/08/2017 23:03:24
- Princesse_Tamtam
- Membre
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
Pages : 1