Столбец 'order_date' в списке полей неоднозначен - PullRequest
0 голосов
/ 01 октября 2019

Я хочу сделать группу поддержки клиентов. У меня есть столбцы customerId и order_date. Я использую самостоятельные объединения, но отображаются некоторые ошибки.

Самостоятельные объединения

SELECT 
   p1.customerId AS id,
   MONTH(order_date) as month,
   YEAR(order_date) as year 
FROM
    jugnoo AS p1
        LEFT JOIN
    jugnoo AS p2 ON p1.id = p2.id
WHERE
    p2.id IN (SELECT DISTINCT
                 (customerId) AS id
              FROM
                  jugnoo
              WHERE
                    MONTH(order_date) = 06
                AND YEAR(order_date) = 2017
              order by year(order_date), month(order_date))
order by 3, 2;

Ожидаемые идентификаторы customerId, соответствующие условию, но отображающие сообщение об ошибке «Столбец order_date» в списке полей:неоднозначный 0,00072 сек "

Ответы [ 4 ]

0 голосов
/ 01 октября 2019

Используйте псевдоним перед именем столбца, например

p1.order_date

ИЛИ

p2.order_date

всякий раз, когда и где вы хотите использовать этот столбец, вам нужно указать таблицу;поэтому используйте имя таблицы или просто используйте псевдоним таблицы, как указано выше.

0 голосов
/ 01 октября 2019

В разделе «Выходные столбцы» вы ссылаетесь на столбцы «order_date», которые существуют в обеих соединенных таблицах (это самообъединение, но механизм SQL не может «угадать», на какую из них вы ссылаетесь).

В секции вывода префикс «p1». или "р2"в order_name, в зависимости от того, из каких частей соединения вы хотите вывести информацию.

Я предполагаю, что это будет p1, но ....

0 голосов
/ 01 октября 2019

Нет JOIN необходимо. Вместо этого просто используйте столбец p1.id.

SELECT 
   p1.customerId AS id,
   MONTH(p1.order_date) as month,
   YEAR(p1.order_date) as year 
FROM
    jugnoo AS p1
WHERE
    p1.id IN (SELECT DISTINCT
                  customerId AS id
              FROM
                  jugnoo p2
              WHERE
                    MONTH(p2.order_date) = 06
                AND YEAR(p2.order_date) = 2017
              order by year(p2.order_date), month(p2.order_date))
order by 3, 2;

Когда задействованы несколько таблиц, рекомендуется квалифицировать все столбцы в программировании. Как p1.id вместо просто id. Меньше подвержено ошибкам, легче читать и поддерживать.

Редактировать: (по запросу)

Использовать коррелированный подзапрос для получения данных за каждый месяц:

SELECT 
   p1.customerId AS id,
   MONTH(p1.order_date) as month,
   YEAR(p1.order_date) as year 
FROM
    jugnoo AS p1
WHERE
    p1.id IN (SELECT DISTINCT
                  p2.customerId AS id
              FROM
                  jugnoo p2
              WHERE
                   MONTH(p2.order_date) = MONTH(p1.order_date) 
                AND YEAR(p2.order_date) = YEAR(p1.order_date))
order by 3, 2;
0 голосов
/ 01 октября 2019

Вам просто нужно изменить дату_порядка. Это неоднозначный столбец: это означает, что вы можете найти этот столбец более чем в одной таблице.
Просто укажите, из какой таблицы вам нужен этот столбец. В этом случае это будет p1, поэтому вы должны использовать p1.order_date

...