使用JOIN查找MAX,其中Field也显示在另一个表中

时间:2014-01-22 17:28:04

标签: sql sql-server tsql

我有3张桌子:Master,Paper和iCodes。对于一组Master.Ref,我需要找到Max(Paper.Date),其中Paper.Code也在iCodes表中(即Paper.Code是一种iCode)。 Master通过File字段加入Paper。

编辑: 我只需要Max(Paper.Date)其相应的代码;我不需要所有的代码。

我写了以下内容,但速度非常慢。我有几百个引号来寻找。有什么更好的方法呢?

SELECT Master.Ref,
       Paper.Code,
   mp.MaxDate
FROM ( SELECT p.File ,
              MAX(p.Date) AS MaxDate ,
       FROM Paper       AS p
       LEFT JOIN Master AS m ON p.File = m.File
       WHERE m.Ref IN ('ref1', 'ref2', 'ref3', 'ref4', 'ref5', 'ref6'... )
         AND p.Code IN ( SELECT DISTINCT i.iCode
                         FROM iCodes AS i
                       )
       GROUP BY p.File
     ) AS mp
LEFT JOIN Master ON mp.File     = Master.File
LEFT JOIN Paper  ON Master.File = Paper.File
                AND mp.MaxDate  = Paper.Date
WHERE Paper.Code IN ( SELECT DISTINCT iCodes.iCode
                      FROM iCodes
                    )

1 个答案:

答案 0 :(得分:0)

这样做你想要的吗?

SELECT m.Ref, p.Code, max(p.date)
FROM Master m LEFT JOIN
     Paper
     ON m.File = p.File
WHERE p.Code IN (SELECT DISTINCT iCodes.iCode FROM iCodes) and
      m.Ref IN ('ref1','ref2','ref3','ref4','ref5','ref6'...)
GROUP BY m.Ref, p.Code;

编辑:

要获取最大日期的代码,请使用窗口函数:

select ref, code, date
from (SELECT m.Ref, p.Code, p.date
             row_number() over (partition by m.Ref order by p.date desc) as seqnum
      FROM Master m LEFT JOIN
           Paper
           ON m.File = p.File
      WHERE p.Code IN (SELECT DISTINCT iCodes.iCode FROM iCodes) and
            m.Ref IN ('ref1','ref2','ref3','ref4','ref5','ref6'...)
     ) mp
where seqnum = 1;

函数row_number()将从1开始的序号分配给一组行。这些组由partition by子句定义,因此在这种情况下,具有相同m.Ref值的所有内容都将位于单个组中。在组内,根据order by子句为行分配编号。因此,具有最大日期的那个获得值1.这是您想要的行。