我有一个连接选择语句,我只需要第二个表中的最后修改字段。这是我现在的选择声明:
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
我得到了下面的错误信息:
聚合可能不会出现在WHERE子句中,除非它位于HAVING子句或选择列表中包含的子查询中,并且要聚合的列是外部引用。
答案 0 :(得分: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
实际上,有几种方法可以做到这一点,它们的效率取决于数据在表中的分布方式。
请参阅我的博客中的这篇文章,了解这些方法的比较:
答案 1 :(得分: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
2005年所有员工都会是这样的:
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