Проблемы с GROUP BY, HAVING и JOINS

Таким образом, целью этого запроса является отображение идентификатора преступника, фамилии и имени (все это можно найти в таблице «Преступники»), а затем отображение только преступников, у которых есть более одного приговора, что я и сделал. с помощью предложения HAVING, отображающего условие, согласно которому преступник должен иметь более одного id_предложения (первичный ключ таблицы Sentence). Однако, когда я ввел следующий код, я получил сообщение об ошибке: «Столбцы, которые используются для именованного соединения (либо ЕСТЕСТВЕННОЕ соединение, либо СОЕДИНЕНИЕ с предложением USING), не могут иметь явного квалификатора.

SELECT c.criminal_id, c.last, c.first
 FROM criminals c JOIN sentences s USING (criminal_id)
 GROUP BY s.criminal_id
 HAVING COUNT(s.sentence_id) > 1;

Я попытался удалить квалификаторы (которые, как я понимаю, являются c. и s., которые предшествуют именам столбцов), но затем я получил сообщение об ошибке, в котором говорилось, что запрос не был выражением GROUP BY. Я рву на себе волосы, пытаясь понять это. Если вы можете помочь, я был бы очень признателен. Спасибо.


person Tom McNish    schedule 21.11.2014    source источник


Ответы (1)


Не берите в голову! Если кто-то еще увидит это, я нашел настоящую ошибку. Я удалил квалификаторы. Настоящая проблема заключалась в том, что когда вы выбираете несколько столбцов при использовании предложения GROUP BY, вы должны GROUP BY ALL выполнять неагрегатные функции. Итак, мой правильный код был таким:

SELECT criminal_id, last, first
 FROM criminals JOIN sentences USING (criminal_id)
 GROUP BY criminal_id, last, first
 HAVING COUNT(sentence_id) > 1;

Надеюсь, это поможет любому, кто наткнулся на этот вопрос.

person Tom McNish    schedule 21.11.2014
comment
Я бы порекомендовал поставить псевдоним на c.last, c.first. Еще лучше избегайте синтаксиса USING и делайте его явным: ON c.criminal_id = s.criminal_id. - person Jeffrey Kemp; 21.11.2014