SQL查询从外键链接表中获取MAX数据的最佳技术

时间:2017-03-14 09:22:17

标签: sql sql-server

我写了两个问题,但觉得它们效率低下。

我有两个查询,一个用于准备数据(数据最初来自旧的狐狸pro db和日期等,其中nvarchars,所以我将它们转换为日期等)第二个,它整理所有准备好的数据导出到csv并最终将csv发送到Web服务。

所以第一个查询...

我有一张人员表和一张展示位置(展示位置是他们所拥有的工作)展示位置表会为一个人提供许多不同的行,我只需要最新的(基于开始和结束日期) ),以下是最有效的方法吗?

PersonCode =此人的唯一ID,代码=展示位置的唯一ID

    SELECT * FROM Person c
      LEFT JOIN 
        (
           SELECT MAX(StartDate) AS StartDate, MAX(EndDate) AS EndDate, MAX(Code) AS Code, PersonCode
            FROM PersonPlacement
        GROUP BY PersonCode
    ) cp ON c.PersonCode = cp.PersonCode
  LEFT JOIN PersonPlacement cp2 ON cp.Code = cp2.Code

所以我的第二个问题是......

第二个查询从第一个查询读取,需要执行以下操作:

  • 根据上次联系日期(原始数据具有欺骗性)仅获取唯一候选人
  • 获取最新展示位置
  • 获取简历数据
  • 仅根据展示位置的开始和结束日期获取当前不在工作中的人员
  • 如果他们的工作即将结束,请告诉他们

请参阅下面的查询...

SELECT *
FROM Pre_PersonView c
INNER JOIN (
    SELECT  PersonCode, Code, row_number() over(partition by PersonCode order by StartDate desc) as rn
    FROM Pre_PersonView

) pj ON c.PersonCode = pj.PersonCode AND pj.rn = 1

LEFT JOIN Pre_PersonView cp ON pj.Code = cp.Code

INNER JOIN (
    SELECT  PersonCode, row_number() over(partition by PersonCode order by LastContactDate desc) as rn
    FROM Person
) uc  ON c.PersonCode = uc.PersonCode AND uc.rn = 1

LEFT JOIN [PersonResumeText] ct ON c.PersonId = ct.PersonId

WHERE c.PersonCode NOT IN
(
    SELECT pcv.PersonCode
     FROM Pre_PersonView pcv
      WHERE pcv.Department IN ('x','y','z')
       AND pcv.StartDate <= GETDATE() 
       AND (CASE WHEN pcv.EndDate = '1899-12-30' THEN GETDATE() + 1 ELSE pcv.EndDate END) > GETDATE()
)

     AND  DATEDIFF(DAY, ISNULL((CASE WHEN cp.StartDate = '0216-07-22' THEN '2016-07-22' ELSE cp.StartDate END), GETDATE() -365), ISNULL((CASE WHEN cp.EndDate = '1899-12-30' THEN NULL ELSE cp.EndDate END), GETDATE() + 1)) 
     > 
     (CASE WHEN cp.Department IN ('x','y','z') THEN 365 ELSE 2 END)

我的问题再次提到这是最有效的方法吗?

0 个答案:

没有答案