Как избежать «неоднозначного» сообщения об ошибке при использовании объединений для создания нескольких таблиц - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь использовать следующий код для создания списка клиентов и их брендов, которые они покупают.Таблица brands имеет фирменное наименование, а таблица customer_id находится в таблице customers.Чтобы связать их, мне нужно соединить вместе brand_id и receipt_id через таблицу receipts (подключается к таблице customers) и таблицу receipt_item_details1 (подключается к таблице brands).

Итак, таблица receipt_item_details1 (имеет столбец brand_id для подключения к таблице brands) и новая таблица customer_receipts (созданная первым внутренним подзапросом) пытаются связать ее с помощью receipt_id.Я хотел бы показать столбец customer_id при создании таблицы, соединяющей эти две таблицы (оригинал: receipt_item_details1, присоединенный к новой таблице: customer_receipts).

ВЫПУСК: Я продолжаю получатьследующая ошибка.как это сделать, а также перечислить бренды?

"ссылка на столбец" customer_id "неоднозначна
LINE 3: ... pts.receipt_id, receive_item_details1.receipt_id, customer_r .."

SELECT customer_brandids.brand_id, brands.brand_id, customer_brandids.customer_id, brands.brand_name
    FROM 
        (SELECT customer_receipts.receipt_id, receipt_item_details1.receipt_id, customer_receipts.customer_id, receipt_item_details1.brand_id
        FROM
            (SELECT receipts.customer_id, customers.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

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Не используйте вложенные селекторы, когда это не нужно, попробуйте использовать объединения, и запрос будет более простым и будет выглядеть примерно так

select * from receipts
join customers on receipts.customer_id = customers.customer_id
join receipt_item_details1 on receipts.receipt_id = receipt_item_details1.receipt_id
join brands on receipt_item_details1.brand_id = brands.brand_id

Вместо звездочки вы можете определить столбцы, которые хотитеполучить

0 голосов
/ 04 октября 2018

Ваш внутренний подвыбор

 (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

Дополнительно :

  1. Вам не нужно приниматьоба столбца (например, receipt_id) из-за INNER JOIN гарантируется, что оба столбца имеют одинаковое значение
  2. . Вы можете использовать псевдонимы для сокращения вашего запроса.
  3. Вы не делаетенеобходимо создать подзапрос для каждого соединения.Просто присоединяйтесь.

В целом, это должно быть сделано так же:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...