Ваш внутренний подвыбор
(SELECT receipts.customer_id, customers.customer_id
генерирует результат с двумя столбцами с именем customer_id
.Таким образом, ваш следующий более высокий подвыбор не может различаться в обоих столбцах, если вы ссылаетесь на customer_id
. Вы должны указать один или оба псевдонима:
(SELECT receipts.customer_id as r_customer_id,
customers.customer_id as c_customer_id
Тогда ваш следующий более высокий запрос может вызвать
SELECT customer_receipts.c_customer_id...
Итак, первый шаг решения проблемы:
SELECT
customer_brandids.brand_id,
brands.brand_id,
customer_brandids.c_customer_id, --> reference alias
brands.brand_name
FROM
(SELECT
customer_receipts.receipt_id as c_receipt_id, --> same problem
receipt_item_details1.receipt_id as r_receipt_id,
customer_receipts.c_customer_id, --> reference alias
receipt_item_details1.brand_id
FROM
(SELECT
receipts.customer_id as r_customer_id, --> here was the problem
customers.customer_id as c_customer_id,
receipts.receipt_id
FROM receipts
INNER JOIN customers
ON receipts.customer_id = customers.customer_id) AS customer_receipts
INNER JOIN receipt_item_details1
ON customer_receipts.receipt_id = receipt_item_details1.receipt_id) AS customer_brandids
INNER JOIN brands
ON customer_brandids.brand_id = brands.brand_id
Дополнительно :
- Вам не нужно приниматьоба столбца (например,
receipt_id
) из-за INNER JOIN
гарантируется, что оба столбца имеют одинаковое значение - . Вы можете использовать псевдонимы для сокращения вашего запроса.
- Вы не делаетенеобходимо создать подзапрос для каждого соединения.Просто присоединяйтесь.
В целом, это должно быть сделано так же:
SELECT b.brand_id, c.customer_id, b.brand_name
FROM receipts r
INNER JOIN customers c ON r.customer_id = c.customer_id
INNER JOIN receipt_item_details1 rid ON r.receipt_id = rid.receipt_id
INNER JOIN brands b ON b.brand_id = rid.receipt_id
demo: db <> fiddle