нужна сложная помощь SQL-запроса - PullRequest
1 голос
/ 26 марта 2009

Я не уверен, как написать этот запрос в SQL. есть две таблицы

**GroupRecords**
Id (int, primary key)
Name (nvarchar)
SchoolYear (datetime)
RecordDate (datetime)
IsUpdate (bit)

**People**
Id (int, primary key)
GroupRecordsId (int, foreign key to GroupRecords.Id)
Name (nvarchar)
Bio (nvarchar)
Location (nvarchar)

возвращает отдельный список людей, принадлежащих к GroupRecords, которые имеют SchoolYear '2000'. В возвращенном списке people.name должен быть уникальным (без дубликатов People.Name), в случае дублирования должен быть возвращен только тот человек, который принадлежит GroupRecords с более поздней RecordDate.

Возможно, было бы лучше написать хранимую процедуру для этого права?

Ответы [ 4 ]

0 голосов
/ 26 марта 2009

Это не проверено, но оно должно делать то, что требуется в вопросе.

Он выбирает все детали о человеке.

Подзапрос заставит его соответствовать только самой последней RecordDate для одного имени. Он также будет выглядеть только в правильной GroupRecord из-за совпадения идентификаторов.

SELECT
    People.Id,
    People.GroupRecordsId,
    People.Name,
    People.Group,
    People.Bio,
    People.Location

FROM
    People
    INNER JOIN GroupRecords ON GroupRecords.Id = People.GroupRecordsId

WHERE
    GroupRecords.SchoolYear = '2000/1/1' AND
    GroupRecords.RecordDate = (
        SELECT 
            MAX(GR2.RecordDate)
        FROM 
            People AS P2
            INNER JOIN GroupRecords AS GR2 ON P2.GroupRecordsId = GR2.Id
        WHERE
            P2.Name = People.Name AND
            GR2.Id = GroupRecords.Id
    )
0 голосов
/ 26 марта 2009

MySQL:

SELECT *
FROM `People`
LEFT JOIN `GroupRecords` ON `GroupRecordsId` = `GroupRecords`.`Id`
GROUP BY `People`.`Name`
ORDER BY `GroupRecords`.`RecordDate` DESC
WHERE `GroupRecords`.`SchoolYear` = '2000/1/1'
0 голосов
/ 26 марта 2009

people.name должно быть уникальным (без дубликатов People.Name)

? Конечно, вы имеете в виду не дубликаты People.ID?

в случае дублирования должно быть возвращено только лицо, принадлежащее к GroupRecords с более поздней датой RecordDate.

Суть в том, что не совсем понятно, как это сделать в простом SQL. Существует несколько подходов к вопросу «Для каждого X выберите строку Y с максимальным / минимальным Z»; какая работа и какая работа лучше, зависит от того, какое программное обеспечение базы данных вы используете.

http://kristiannielsen.livejournal.com/6745.html содержит несколько хороших обсуждений некоторых обычных методов для борьбы с этим (в контексте MySQL, но широко применяется).

0 голосов
/ 26 марта 2009
Select Distinct ID 
From People 
Where GroupRecordsID In 
   (Select Id From GroupRecords
    Where SchoolYear = '2000/1/1')

Это создаст отдельный список людей в классе 2000 ... но я не понимаю, что вы думаете о дубликатах ... пожалуйста, уточните ...

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...