Псевдоним INNER JOIN ссылается на столбец в списке полей SQL - PullRequest
0 голосов
/ 27 сентября 2018

Я действительно борюсь за это.

SELECT t1.servizio, 
       Count(DISTINCT p.pro_id), 
       Count(DISTINCT CASE 
                        WHEN Concat(p.pro_id, p.gender) LIKE '%M' THEN p.pro_id 
                      END) AS 'M', 
       Count(DISTINCT CASE 
                        WHEN Concat(p.pro_id, p.gender) LIKE '%F' THEN p.pro_id 
                      END) AS 'F', 
       Count(DISTINCT CASE 
                        WHEN Concat(p.pro_id, p.in_provincia) LIKE '%Si' THEN 
                        p.pro_id 
                      END) AS 'prov_si', 
       Count(DISTINCT CASE 
                        WHEN Concat(p.pro_id, p.in_provincia) LIKE '%No' THEN 
                        p.pro_id 
                      END) AS 'prov_no', 
       Count(DISTINCT t1.pronto_request_id), 
       Count(t2.quote_id) 
FROM   pro p, 
       pro_request pr, 
       request_servizio t1 
       JOIN (SELECT request_servizio.servizio, 
                    Count(quote_request.quote_id) 
             FROM   request_servizio, 
                    quote_request 
             WHERE  request_servizio.pronto_request_id = 
                    quote_request.pronto_request_id 
             GROUP  BY request_servizio.servizio) AS t2 
         ON t1.servizio = t2.servizio 
WHERE  p.pro_id = pr.pro_id 
       AND pr.pronto_request_id = t1.pronto_request_id 
GROUP  BY t1.servizio

По сути, у меня есть 4 таблицы: request_servizio, pro, pro_request и quote_request.

Проблема с последним выбранным столбцом:

ошибка: «неизвестный столбец t2.quote_id ...»

Но все же t2 является псевдонимом объединения.Так почему я получил эту ошибку?

Я попытался включить таблицу quote_request, в которой можно найти последний атрибут, но тогда я получил неправильную агрегацию.Как этого избежать?

Заранее спасибо!

1 Ответ

0 голосов
/ 27 сентября 2018

В JOIN используемый вами подзапрос не предоставляет столбец quote_id, что означает, что вы не можете ссылаться на него из псевдонима t2, так как он не был предоставлен во внутреннем подзапросе в части выбора.Вы можете использовать только то, что вы даете из внутреннего запроса.

Я бы сказал, измените запрос на этот, так как у вас уже есть счетчик, который вы хотите использовать.

SELECT t1.servizio, 
   Count(DISTINCT p.pro_id), 
   Count(DISTINCT CASE 
                    WHEN Concat(p.pro_id, p.gender) LIKE '%M' THEN p.pro_id 
                  END) AS 'M', 
   Count(DISTINCT CASE 
                    WHEN Concat(p.pro_id, p.gender) LIKE '%F' THEN p.pro_id 
                  END) AS 'F', 
   Count(DISTINCT CASE 
                    WHEN Concat(p.pro_id, p.in_provincia) LIKE '%Si' THEN 
                    p.pro_id 
                  END) AS 'prov_si', 
   Count(DISTINCT CASE 
                    WHEN Concat(p.pro_id, p.in_provincia) LIKE '%No' THEN 
                    p.pro_id 
                  END) AS 'prov_no', 
   Count(DISTINCT t1.pronto_request_id), 
   Count(t2.CountOfQuoteId) --edit here
FROM   pro p, 
   pro_request pr, 
   request_servizio t1 
   JOIN (SELECT request_servizio.servizio, 
                Count(quote_request.quote_id) AS CountOfQuoteId --edit here
         FROM   request_servizio, 
                quote_request 
         WHERE  request_servizio.pronto_request_id = 
                quote_request.pronto_request_id 
         GROUP  BY request_servizio.servizio) AS t2 
     ON t1.servizio = t2.servizio 
WHERE  p.pro_id = pr.pro_id 
   AND pr.pronto_request_id = t1.pronto_request_id 
GROUP  BY t1.servizio

Также выможет изменить эти соединения на более новый стандарт, он намного чище и проще в использовании.

...