2012-04-27 5 views
4

Скажем, у меня есть таблица Person и таблица Courses. В таблице Person у меня есть столбец PersonName. В таблице Courses, скажем, у меня есть CourseTitle, PersonName и CourseDifficulty. CourseDifficulty - 1-4 (4 - самый тяжелый). Как мне вернуть список людей от Person и для каждого человека есть столбец, который показывает самый сложный класс, который они принимают на CourseTitle.SQL Создание столбца псевдонима для вложенного выбора?

Насколько я знаю, я бы получить CourseTitle из самых сложных класса Бретт принимает, выполнив следующие действия:

SELECT CourseTitle 
FROM Courses 
WHERE PersonName = 'Brett' 
    AND CourseDifficulty = (SELECT MAX(CourseDifficulty) 
          FROM Courses 
          WHERE PersonName='Brett') 

Но как я бегу, что для каждого человека в таблице Person? Я хочу, чтобы результаты были что-то вроде

Brett-SQL For Dummies 4 
Tim-Quantum Mechanics 
Jane-Thermodynamics 2 

Извините за отсутствие. Заранее спасибо за помощь!

+0

Что вы хотите, если студент имеет более 1 «Самый трудный курс». (О, и это домашняя работа?) –

+0

Нет, это для работы. У меня гораздо более сложный сценарий, но это то, что мне нужно делать на самом базовом уровне. В этом случае ни у одного человека не будет двух курсов с одинаковой трудностью. – DontFretBrett

ответ

5

вы можете использовать следующие

SELECT p.name ,p.address, c.courseTitle ,c.courseDifficulty FROM (
     SELECT personName, courseTitle, MAX(courseDifficulty) AS courseDifficulty 
     FROM course 
     GROUP BY personName 
) AS c RIGHT JOIN person AS p ON p.name = c.personName 

здесь я если допустить PERSONNAME является уникальным. В противном случае вы можете использовать уникальный идентификатор здесь вместо имени человека и добавить это поле в оператор select.

+0

Ах, вы можете использовать AS AS, а затем присоединиться к другой таблице. Я думаю, это будет сделано для меня. Я попробую и вернусь к тебе – DontFretBrett

1

Попробуйте это:

SELECT c.CourseTitle, c.PersonName, c.CourseDifficulty 
    FROM Courses c 
WHERE c.CourseDifficulty=(SELECT MAX(c2.CourseDifficulty) FROM Courses c2 WHERE c2.PersonName=c.PersonName) 
+0

Что делать, если самый сложный класс Бретта - 3, а самый сложный класс Боба - 4. Если вы только вернете 4-х, Бретт будет исключен. Возможно, я читаю его неправильно – DontFretBrett

+0

Я пошел вперед и попробовал. Из 1186 записей в таблице «Курсы» я получил 964 назад, и он возвратил все разные значения CourseDifficulty с 1 по 4, а столбец PersonName не отличался для каждого Person. – DontFretBrett

+0

Этот SQL должен только возвращать записи для тех курсов, которые являются самыми трудными для человека в записи. Однако, если у человека более одного курса с одинаковым максимальным уровнем сложности, он вернет все из них. Я думаю, именно поэтому вы получаете мультипликаторы для одного и того же человека ... в этом сценарии, что нужно вернуть? – JoshL

Смежные вопросы