Не уникальный стол / псевдоним? - PullRequest
0 голосов
/ 24 ноября 2018

Я получаю эту ошибку: Не уникальная таблица / псевдоним: 'почтовый индекс'

"SELECT sub.city AS city, sub.postalcode AS postalcode FROM 
(SELECT postcode.city AS city,  customers.postalcode AS postalcode, COUNT(customers.postalcode) AS postcode_numbers
FROM orders, postcode 
INNER JOIN customers ON orders.userID = customers.ID 
INNER JOIN postcode ON customers.postalcode = postcode.city 
GROUP BY customers.postalcode) sub 
WHERE sub.postcode_numbers > 3";

Ответы [ 4 ]

0 голосов
/ 24 ноября 2018

Вы можете написать это как:

SELECT p.city,  c.postalcode , COUNT(*) AS num_orders
FROM orders o JOIN
     customers c
     ON o.userID = c.ID JOIN
     postcode p
     ON c.postalcode = p.city 
GROUP BY p.city, c.postalcode
HAVING COUNT(*) > 3;

Неясно, хотите ли вы одну строку для city или для city / postalcode.Это предполагает последнее.Если вам нужна одна строка на city, удалите postalcode из и SELECT и GROUP BY.

Примечания:

  • Никогда не используйте запятые в предложении FROM. Всегда использовать правильный, явный, стандартный JOIN синтаксис.Это ваша конкретная проблема.
  • Псевдонимы таблиц облегчают написание и чтение запроса.
  • Неагрегированные столбцы в SELECT должны соответствовать клавишам GROUP BY.
  • Подзапрос не требуется.
0 голосов
/ 24 ноября 2018

В вашем предложении from и вашем втором предложении join указано postcode.Удалите его из предложения from, и все будет в порядке:

SELECT sub.city AS city, sub.postalcode AS postalcode FROM 
(SELECT postcode.city AS city,  customers.postalcode AS postalcode, COUNT(customers.postalcode) AS postcode_numbers
FROM orders -- Removed postcode from here 
INNER JOIN customers ON orders.userID = customers.ID 
INNER JOIN postcode ON customers.postalcode = postcode.city 
GROUP BY customers.postalcode) sub 
WHERE sub.postcode_numbers > 3
0 голосов
/ 24 ноября 2018

Вы используете таблицу почтовых индексов как в предложении FROM, так и в предложении INNER JOIN, ни у одного из которых нет псевдонима. Когда вы выполняете INNER JOIN, вам не нужно иметь эту таблицу в предложении FROM, и наоборотКонечно.

Если вы хотите объединить таблицы в предложении FROM, вы должны сделать что-то вроде этого:

SELECT
    sub.city AS city, sub.postalcode AS postalcode 
FROM 
    (SELECT 
         postcode.city AS city,  customers.postalcode AS postalcode, 
         COUNT(customers.postalcode) AS postcode_numbers
     FROM 
         orders, postcode 
     INNER JOIN 
         customers ON orders.userID = customers.ID 
     --INNER JOIN postcode ON customers.postalcode = postcode.city
     WHERE 
         postcode.city = customers.postalcode
     GROUP BY 
         customers.postalcode) sub 
WHERE 
    sub.postcode_numbers > 3;

Таким образом, в основном вы потеряете почтовый индекс INNER JOIN ... line

Другой способ сделать это - использовать только предложение INNER JOIN, которое я предпочитаю.Для этого вам нужно только потерять почтовый индекс в предложении FROM, например:

SELECT 
    sub.city AS city, sub.postalcode AS postalcode 
FROM 
    (SELECT 
         postcode.city AS city,  customers.postalcode AS postalcode, 
         COUNT(customers.postalcode) AS postcode_numbers
     FROM 
         orders 
     INNER JOIN 
         customers ON orders.userID = customers.ID 
     INNER JOIN 
         postcode ON customers.postalcode = postcode.city
     GROUP BY 
         customers.postalcode) sub 
WHERE 
    sub.postcode_numbers > 3;

Надеюсь, это поможет!

0 голосов
/ 24 ноября 2018
Remove postcode  table in the from statement   
 SELECT sub.city AS city, sub.postalcode AS postalcode FROM 
    (SELECT postcode.city AS city,  customers.postalcode AS postalcode, COUNT(customers.postalcode) AS postcode_numbers
    FROM orders
    INNER JOIN customers ON orders.userID = customers.ID 
    INNER JOIN postcode ON customers.postalcode = postcode.city 
    GROUP BY customers.postalcode) sub 
    WHERE sub.postcode_numbers > 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...