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