我使用SSMS查询Server 2012。我需要与最早的STARTDATE的NPH表的记录。如果我有一个具有相同开始日期的行的客户端,我将得到一行。但是对于具有不同开始日期的行的客户端,我完全没有结果。为什么它不把min(开始日期)从PLACEMENTHISTORY表中带回来?
select distinct lsf.CLIENTNUMBER
,nph.ENDDATE
,nph.STARTDATE
from legalstatusform lsf
left join PLACEMENTHISTORY nph on nph.CLIENTNUMBER = lsf.clientnumber
and (nph.STARTDATE = (select min(startdate) from PLACEMENTHISTORY x
where x.CLIENTNUMBER = nph.CLIENTNUMBER))
where nph.ENDDATE >= '2017-05-01'
and nph.ENDDATE <= '2017-05-31'
and nph.CLIENTNUMBER = '2001'
group by lsf.CLIENTNUMBER, lsf.ENDDATE, nph.STARTDATE, nph.ENDDATE这个逻辑没有给我任何结果。
如果我注释出min(startdate)逻辑,我将得到该客户端的3行数据。2017年1月31日、2017年11月4日和2017年10月5日开始。那么,根据min( startdate )逻辑,为什么我没有得到1行与1/31/2017开始日期?
发布于 2017-12-11 16:08:24
不要使用子查询(并对表进行两次解析),而是尝试使用CTE。这种类型可能最终会变得同样昂贵,取决于您的索引:
WITH CTE AS(
SELECT lsf.CLIENTNUMBER,
nph.ENDDATE,
nph.STARTDATE,
ROW_NUMBER() OVER (PARTITION BY lsf.CLIENTNUMBER ORDER BY nph.STARTDATE) AS RN
FROM legalstatusform lsf
LEFT JOIN PLACEMENTHISTORY nph ON nph.CLIENTNUMBER = lsf.clientnumber
WHERE nph.ENDDATE >= '2017-05-01'
AND nph.ENDDATE <= '2017-05-31'
AND nph.CLIENTNUMBER = '2001'
GROUP BY lsf.CLIENTNUMBER, lsf.ENDDATE, nph.STARTDATE, nph.ENDDATE)
SELECT *
FROM CTE
WHERE RN = 1;发布于 2017-12-11 16:06:08
select distinct几乎不适合使用group by。
您的问题是where子句中的条件。这些将外部连接转化为内部连接。试试这个:
select distinct lsf.CLIENTNUMBER, nph.ENDDATE, nph.STARTDATE
from legalstatusform lsf left join
PLACEMENTHISTORY nph
on nph.CLIENTNUMBER = lsf.clientnumber and
nph.STARTDATE = (select min(startdate)
from PLACEMENTHISTORY x
where x.CLIENTNUMBER = nph.CLIENTNUMBER)
) and
nph.ENDDATE >= '2017-05-01' and
nph.ENDDATE <= '2017-05-31'
where lsf.CLIENTNUMBER = '2001';备注:
ENDDATE条件。CLIENTNUMBER是一个数字,那么'2001'不应该有引号。发布于 2017-12-11 16:06:14
因为带有MIN()的子查询没有这样的条件:
where nph.ENDDATE >= '2017-05-01'
and nph.ENDDATE <= '2017-05-31'只运行子查询
select min(startdate) from PLACEMENTHISTORY
where x.CLIENTNUMBER = '2001'并查看带有MIN() startdate的行是否与外部查询中的筛选器匹配。
https://stackoverflow.com/questions/47756727
复制相似问题