2017-08-02 2 views
0

Kein Experte für SQL, aber ich habe es geschafft, diese Abfrage funktioniert und liefert die Ergebnisse, die ich brauche. Der Trick besteht darin, dass es funktioniert. Die beiden fraglichen Tabellen enthalten jeweils ca. 6 mil Datensätze. Es läuft derzeit um ca. 3 Minuten, das ist der Weg, wo ich es brauche.Postgres Mehrere Joins

SELECT p.id, 
     match.weight 
FROM store_promotions p 
LEFT JOIN 
    (SELECT * 
    FROM 
    (SELECT id, 
      (facets.weight::int * 1.5) AS weight 
     FROM store_promotions promos 
     JOIN -- this will return all promos, but add weight of 1.5 to the ones that are better matched to customer 

     (SELECT (jsonb_array_elements(product) ->> 'key') AS barcode, 
       (jsonb_array_elements(product) ->> 'doc_count') AS weight 
     FROM customer_transaction_facets 
     WHERE account_id = '1234567890') facets ON promos.products @> to_jsonb(facets.barcode::text) 
     UNION SELECT id, 
        (facets.weight::int * .75) AS weight -- this will return all promos, but add weight of .75 for department matches to the ones that are better matched to customer 
     FROM store_promotions promos 
     JOIN 
     (SELECT (jsonb_array_elements(department) ->> 'key') AS department, 
       (jsonb_array_elements(department) ->> 'doc_count') AS weight 
     FROM customer_transaction_facets 
     WHERE account_id = '1234567890') facets ON promos.departments @> to_jsonb(facets.department::text)) matches) AS MATCH ON p.id = match.id WHERE storeid = '637' 

Antwort

0
select id, weight 
from 
    store_promotions promos 
    left join (
     select 
      (jsonb_array_elements(product) ->> 'key') as key, 
      (jsonb_array_elements(product) ->> 'doc_count')::int * 1.5 as weight 
     from customer_transaction_facets 
     where account_id = '1234567890' 
     union 
     select 
      (jsonb_array_elements(department) ->> 'key') as key, 
      (jsonb_array_elements(department) ->> 'doc_count')::int * 0.75 as weight 
     from customer_transaction_facets 
     where account_id = '1234567890' 
    ) facets on 
     promos.products @> to_jsonb(facets.key::text) 
     or 
     promos.departments @> to_jsonb(facets.key::text) 
where storeid = '637'