SQL查询 - 仅返回最后一行的连接

时间:2010-01-11 18:48:21

标签: sql sql-server tsql

我有一个连接选择语句,我只需要第二个表中的最后修改字段。这是我现在的选择声明:

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子句或选择列表中包含的子查询中,并且要聚合的列是外部引用。

2 个答案:

答案 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