несколько объединений в одном столбце с псевдонимом - PullRequest
0 голосов
/ 21 апреля 2020

Я пытаюсь объединить несколько таблиц вместе. 2 таблицы должны быть объединены в одном столбце. Однако мне нужно использовать указанный псевдоним столбца, так как значения будут совпадать только после замены текста. Так что я;

table1:
| date_time | product_quote | category_id

table2: 
| product_id | category_id

table3: 
| date | product_id | sales

table4: 
| category_id | category_name

Значением 'product_quote' является строка, содержащая идентификатор продукта. Я могу добраться до этого с помощью REPLACE.

Желаемый результат:

| year | month | week | day | product_id | quotes | sales | category_name 

Я пытаюсь использовать следующий запрос, но он жалуется, что 'product_id' является неоднозначным. Когда я выполняю третье соединение на table2.product_id, он выполняет запрос, но я получаю неправильные цифры продаж. Также не знаете, как (повторно) использовать псевдонимы даты (год, месяц и т. Д. c) в операторе соединения.

SELECT  
    date_part('year', table1.date_time) as "year", 
    date_part('month', table1.date_time) as "month", 
    date_part('week', table1.date_time) as "week", 
    date_part('day', table1.date_time) as "day",
    REPLACE(REPLACE(table1.product_quote,'/quotes/',''),'.pdf','') as "product_id", 
    count(table1.product_quote) as quotes,
    table3.sales,
    table4.category_name
from table1
left join table2 ON "product_id" = table2.product_id
left join table4 ON table2.category_id = table4.category_id
left join table3 ON "product_id" = table3.product_id AND 
                        date_part('year', table3.date) = date_part('year', table1.date_time) AND 
                        date_part('month', table3.date) = date_part('month', table1.date_time) AND 
                        date_part('day', table3.date) = date_part('day', table1.date_time)  
where date_part('year', table1.date_time) = '2020'
group by year, month, week, day, table2.product_id, table1.product_quote, table4.category_name, table3.sales

Это то, что я должен делать как 1 запрос с 3 объединениями, или мне нужно использовать подзапросы? (и если да, то как?)

1 Ответ

0 голосов
/ 21 апреля 2020

Я думаю, что вы предполагаете, что вы присоединяетесь на основе проекции "product_id" (или "псевдоним", как вы ее называете) в части SELECT. Но это не тот случай. В SQL JOIN всегда происходит первым, поэтому часть JOIN не «знает» о SELECT -Части.

Чтобы решить вашу проблему, вам нужно

  • используйте выражение REPLACE дважды в JOIN
  • всегда с префиксом product_id перед таблицей

SELECT  
    date_part('year', table1.date_time) as "year", 
    date_part('month', table1.date_time) as "month", 
    date_part('week', table1.date_time) as "week", 
    date_part('day', table1.date_time) as "day",
    REPLACE(REPLACE(table1.product_quote,'/quotes/',''),'.pdf','') as "product_id", 
    count(table1.product_quote) as quotes,
    table3.sales,
    table4.category_name
from table1
left join table2 ON REPLACE(REPLACE(table1.product_quote,'/quotes/',''),'.pdf','') = table2.product_id
left join table4 ON table2.category_id = table4.category_id
left join table3 ON REPLACE(REPLACE(table1.product_quote,'/quotes/',''),'.pdf','') = table3.product_id AND 
                        date_part('year', table3.date) = date_part('year', table1.date_time) AND 
                        date_part('month', table3.date) = date_part('month', table1.date_time) AND 
                        date_part('day', table3.date) = date_part('day', table1.date_time)  
where date_part('year', table1.date_time) = '2020'
group by year, month, week, day, table2.product_id, table1.product_quote, table4.category_name, table3.sales

По крайней мере, выше базовый c раствор. Вы также можете использовать псевдонимы, если вы проецируете table1 до join, используя подвыбор:

SELECT  
    t1.year,
    t1.month,
    t1.week,
    t1.day,
    t1.product_id,
    t1.quotes,
    table3.sales,
    table4.category_name
FROM
(
    SELECT 
    date_part('year', table1.date_time) as "year", 
    date_part('month', table1.date_time) as "month", 
    date_part('week', table1.date_time) as "week", 
    date_part('day', table1.date_time) as "day",
    REPLACE(REPLACE(table1.product_quote,'/quotes/',''),'.pdf','') as "product_id", 
    count(table1.product_quote) as quotes,
    from table1
) as t1
left join table2 ON t1.product_id = table2.product_id
left join table4 ON table2.category_id = table4.category_id
left join table3 ON t1.product_id = table3.product_id AND 
                        date_part('year', table3.date) = t1.year AND 
                        date_part('month', table3.date) = t1.month AND
                        date_part('day', table3.date) = t1.day
where t1.year = '2020'
group by t1.year, t1.month, t1.week, t1.day, table2.product_id, t1.product_quote, table4.category_name, table3.sales
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...