2009-03-26 7 views
1

Je ne sais pas comment écrire cette requête en SQL. il y a deux tablesrequête sql complexe aide nécessaire

**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) 

retour d'une liste distincte des personnes qui appartiennent à GroupRecords qui ont une de l'année scolaire « 2000 ». Dans la liste renvoyée, nom_personnel doit être unique (pas de doublon Nom_personnel), dans le cas d'une duplication, seule la personne qui appartient à GroupRecords avec le dernier RecordDate doit être renvoyée.

Il serait probablement préférable d'écrire une procédure stockée pour ce droit?

+0

est ce devoir? –

+0

non c'est pour un site Web de l'école – ssl

+0

et je ne peux pas modifier la structure existante. – ssl

Répondre

0

Ceci n'est pas testé, mais il doit faire ce qui est requis dans la question.

Il sélectionne tous les détails concernant la personne.

La sous-requête le fera correspondre uniquement au dernier RecordDate pour un nom unique. Il apparaîtra également dans le bon GroupRecord en raison de la correspondance entre les identifiants.

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

Notez que cette approche de groupwise maximum retournera plusieurs lignes s'il y a deux grouprecords avec le même RecordDate. – bobince

+0

Juste, bel endroit sur celui-là.Deux personnes portant le même nom sur le même RecordDate seront sélectionnées, mais comment sélectionner la dernière en date si la date est la même? – Martin

0
Select Distinct ID 
From People 
Where GroupRecordsID In 
    (Select Id From GroupRecords 
    Where SchoolYear = '2000/1/1') 

Cela produira une liste distincte de ces personnes dans la classe 2000 ... mais je ne comprends pas ce que vous obtenez à la cpmment sur les doublons ... s'il vous plaît ... élaborer

Il se lit comme si vous parlez quand deux personnes différentes ont le même nom que vous ne voulez pas les deux énumérés ... Est-ce vraiment ce que vous voulez?

0

MySQL spécifique:

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

people.name doit être unique (pas People.Name en double)

? Sûrement que vous voulez dire pas de doublons People.ID? En cas de duplication, seule la personne qui appartient à GroupRecords avec le RecordDate ultérieur doit être renvoyée.

Il y a le frotter - c'est le peu que ce n'est pas évident à faire en langage SQL. Il y a un certain nombre d'approches à la question «Pour chaque X, sélectionnez la ligne Y avec maximum/minimum Z»; qui fonctionnent et qui fonctionnent le mieux dépendent du logiciel de base de données que vous utilisez.

http://kristiannielsen.livejournal.com/6745.html a une bonne discussion de certaines des techniques habituelles pour attaquer ceci (dans le contexte de MySQL, mais largement applicable).