2010-01-11 7 views
1

J'ai reçu une instruction select de jointure et j'ai seulement besoin du dernier champ modifié dans la seconde table. voici l'instruction select que j'ai maintenant:sql query - join qui renvoie uniquement la dernière ligne

SELECT NOM,PRENOM,OEDP.NUM_EMP,N_A_S,SIT_STATUT,PERMIS,DATE_EMBAUCHE,ADRESSE1,VILLE1,PROVINCE1,CODE_POSTAL1,TEL_RESIDENCE 
FROM ODS_EMPLOYE_DOSSIER_PERSONNEL AS OEDP 
JOIN ODS_SITUATION_POSTE AS OSP 
ON  OEDP.NUM_EMP = OSP.NUM_EMP 
WHERE SIT_DATE_CHG = MAX(SIT_DATE_CHG) 
ORDER BY 
     OEDP.NUM_EMP 

i obtenu le erreur folowing msg:

Un agrégat ne peut apparaître dans la clause WHERE à moins qu'il soit dans une sous-requête contenue dans une clause HAVING ou une sélection liste, et la colonne en cours d'agrégation est une référence externe.

+0

Est-ce vous utilisez 2005+? – Hogan

+0

(essaie de se souvenir du français de l'école secondaire) – Hogan

Répondre

2
SELECT NOM,PRENOM,OEDP.NUM_EMP,N_A_S,SIT_STATUT,PERMIS,DATE_EMBAUCHE,ADRESSE1,VILLE1,PROVINCE1,CODE_POSTAL1,TEL_RESIDENCE 
FROM ODS_EMPLOYE_DOSSIER_PERSONNEL AS OEDP 
CROSS APPLY 
     (
     SELECT TOP 1 * 
     FROM ODS_SITUATION_POSTE AS OSP 
     WHERE OEDP.NUM_EMP = OSP.NUM_EMP 
     ORDER BY 
       SIT_DATE_CHG DESC 
     ) OSP 
ORDER BY 
     OEDP.NUM_EMP 

En fait, il existe plusieurs méthodes pour cela, et leur efficacité dépend de la façon dont les données sont réparties dans les tables.

Voir cet article dans mon blog pour la comparaison de ces méthodes:

+0

CROSS APPLY ????? – Hogan

+0

'@ Hogan':' CROSS APPLY' !!!!! – Quassnoi

+0

@Quassnoi: Le 2ème exemple n'est-il pas meilleur? (Je suppose que ça ne marchera pas avant 2005) – Hogan

0
SELECT TOP 1 NOM,PRENOM,OEDP.NUM_EMP,N_A_S,SIT_STATUT,PERMIS,DATE_EMBAUCHE,ADRESSE1,VILLE1,PROVINCE1,CODE_POSTAL1,TEL_RESIDENCE 
FROM ODS_EMPLOYE_DOSSIER_PERSONNEL AS OEDP 
JOIN ODS_SITUATION_POSTE AS OSP ON OEDP.NUM_EMP = OSP.NUM_EMP 
ORDER BY SIT_DATE_CHG DESC 

Avec 2005 pour tous les employés serait quelque chose comme ceci:

WITH LastUserInfo AS 
(
    SELECT NUM_EMP, MAX(SIT_DATE_CHG) AS SIT_DATE_CHG 
    FROM ODS_EMPLOYE_DOSSIER_PERSONNEL AS OEDP 
    JOIN ODS_SITUATION_POSTE AS OSP 
    ON  OEDP.NUM_EMP = OSP.NUM_EMP 
    GROUP BY NUM_EMP 
) 
SELECT NOM,PRENOM,OEDP.NUM_EMP,N_A_S,SIT_STATUT,PERMIS,DATE_EMBAUCHE,ADRESSE1,VILLE1,PROVINCE1,CODE_POSTAL1,TEL_RESIDENCE 
FROM ODS_EMPLOYE_DOSSIER_PERSONNEL AS OEDP 
JOIN ODS_SITUATION_POSTE AS OSP 
ON  OEDP.NUM_EMP = OSP.NUM_EMP 
INNER JOIN LastUserInfo L ON NUM_EMP = L.NUM_EMP AND SIT_DATE_CHG = L.SIT_DATE_CHG 
ORDER BY 
     OEDP.NUM_EMP 
+0

Cela retournera toutes les liaisons en cas de doublons sur 'SIT_DATE_CHG'. – Quassnoi