【问题标题】:sql query - join that return only last rowsql 查询 - 只返回最后一行的连接
【发布时间】:2010-01-11 18:48:20
【问题描述】:

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

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

【问题讨论】:

  • (试着记住高中的法语)

标签: sql sql-server tsql


【解决方案1】:
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

实际上,有几种方法可以做到这一点,它们的效率取决于数据在表中的分布方式。

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

【讨论】:

  • @Quassnoi:我给出的第二个例子不是更好吗? (我猜它不会在 2005 年之前工作)
  • @Hogan:如果日期字段重复,您的解决方案将返回平局。
  • @Q : 你说我的也会返回领带......但这不会吗? -- 反正这个是O(N1*N2),我的是O(N1+N2),好像不太好。
  • @Hogan:不,这不会。您最好阅读文章并查看实际的执行计划。 SQL ServerO(N1*N2) 聪明得多
  • @Q:不错的文章——我还在努力吸收它。
【解决方案2】:
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

【讨论】:

  • 如果SIT_DATE_CHG 出现重复,这将返回所有平局。
猜你喜欢
  • 2013-09-12
  • 2018-08-11
  • 2017-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-27
  • 1970-01-01
相关资源
最近更新 更多