Bonjour,
Tout d'abord, je viens juste, aujourd'hui, de créer cette requête. Je ne connais pas bien les jointures, elle vous paraîtra certainement horrible, c'est aussi pour ça que je suis là.
La base est celle fournie par Odoo. J'utilise psql car je ne peux pas obtenir le résultat que je souhaite pas l'export dans le client. Mon but est de sortir un fichier csv qui ressemble à ça:
Je ne sais pas si c'est faisable. Je veux dire, laisser les cases redondantes vides (id,name). Au pire c'est pas grave, regex est là pour ça...
Les tables impliquées:
Ma requête pour l'instant:
Comme vous pouvez le voir, les jointures sont faites un peu au hasard (LEFT, RIGHT, INNER, FULL ?) et le UNION combiné aux 'null AS <field>' me sort plus d'enregistrements qu'escompté.
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
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 SELECT ( SELECT * FROM ref('product.template', t.id) ) AS id, t.name AS name, ( SELECT * FROM ref('product.product', p.id) ) AS prod_id, p.default_code AS default_code, v.name AS p_value, null AS line_id, null AS attribute, null AS _value FROM product_template AS t FULL JOIN product_product AS p ON t.id = p.product_tmpl_id FULL JOIN product_attribute_value_product_product_rel AS vp ON p.id = vp.prod_id FULL JOIN product_attribute_value AS v ON vp.att_id = v.id UNION SELECT id, name, null AS prod_id, null AS default_code, null AS p_value, line_id, attribute, string_agg(val, ',') AS _value FROM ( SELECT ( SELECT * FROM ref('product.template', t.id) ) AS id, t.name AS name, ( SELECT * FROM ref('product.attribute.line', l.id) ) AS line_id, a.name AS attribute, v.name AS val FROM product_template AS t FULL JOIN product_attribute_line AS l ON t.id = l.product_tmpl_id FULL JOIN product_attribute AS a ON a.id = l.attribute_id FULL JOIN product_attribute_line_product_attribute_value_rel AS lv ON l.id = lv.line_id FULL JOIN product_attribute_value AS v ON lv.val_id = v.id ) AS s GROUP BY id, name, line_id, attribute ORDER BY name, default_code;
Je m'attends à ce que le nombre de lignes soit égal au nombre de lignes dans la table product_product ajouté au nombre de lignes dans la table product_attribute_line.
Je m'excuse si la requête est très bordélique, je me suis remis au SQL hier.
Merci de votre lecture, et de votre aide éventuelle.
PS: je connais la command pour sortir un CSV, je parle de CSV pour justifier la grosse requête avec string_agg, ...
Partager