Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql查询-只返回最后一行的联接_Sql_Sql Server_Tsql - Fatal编程技术网

sql查询-只返回最后一行的联接

sql查询-只返回最后一行的联接,sql,sql-server,tsql,Sql,Sql Server,Tsql,我得到了一个join select语句,只需要第二个表中最后修改的字段。下面是我现在的select语句: 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

我得到了一个join select语句,只需要第二个表中最后修改的字段。下面是我现在的select语句:

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

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
实际上,有几种方法可以做到这一点,它们的效率取决于数据在表中的分布方式

有关这些方法的比较,请参见我博客中的这篇文章:

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

试着从高中开始记住法语school@Quassnoi:我举的第二个例子不是更好吗?我想这对学前教育不起作用2005@Hogan:如果日期字段中出现重复项,您的解决方案将返回领带。@Q:您说过我的解决方案也将返回领带。。。但这不会???-不管怎样,这个是1*N2,我的是1+N2,看起来不太好。@Hogan:不,这个不会。你最好阅读这篇文章,看看实际的执行计划。SQL Server比ON1智能得多*N2@Q:好文章-我仍在努力吸收它。这将返回所有领带,以防在SIT_DATE_CHG上重复。
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