加入新秀错误

时间:2016-03-01 18:55:24

标签: sql-server left-join

我相信我在最后一次加入时犯了一个菜鸟错误,但我看不出它是什么。代码工作,直到我需要添加DONCOMMS表中记录的最后一个条目。 (此表包含每个捐赠者的所有通信)现在我从第一个表中为每个条目获得3个重复行。

原始报告向我展示了DON0010的所有捐助者承诺,并分别将AREA和DON0001表中的区域描述和捐赠者联系起来。我现在想要在DONCOM10中找到每个承诺中的DONCOMMS中发现的最新信息。

select
 pl.[PLEDGE_NO]
,d1.[DONOR_NO]
,rtrim(pl.DONOR) DONOR
,d1.[CONTACT_NAME]
,d1.[AREA1]
,a1.[DESCRIPTION] 
,pl.[AMOUNT]
,pl.[AMOUNT_RECVD]
,pl.[TYPE]
,ISNULL(t2.[COMM_TYPE],'') AS COMM_TYPE
,ISNULL(t2.[REFERENCE],'') AS REFERENCE
,ISNULL(t2.[DETAIL],'') AS DETAIL
,replace(isnull(convert(varchar, t2.[DATE], 103),''),'01/01/1753','') COMMS_DATE
,ISNULL(t2.[CONTACT],'') AS CONTACT
from don0010 pl    
left join DON0001 d1 on pl.[DONOR] = d1.[DONOR]  
left join AREA1 a1 on d1.[AREA1] = a1.[AREA]
**left join (Select * from doncomms dc where dc.DATE = (SELECT MAX(DATE)    FROM doncomms WHERE DONOR_NO = dc.DONOR_NO) and ENTITY = 'C') t2
on t2.[DONOR_NO] = d1.[DONOR_NO]** 

3 个答案:

答案 0 :(得分:0)

select
   pl.[PLEDGE_NO]
  ,d1.[DONOR_NO]
  ,rtrim(pl.DONOR) DONOR
  ,d1.[CONTACT_NAME]
  ,d1.[AREA1]
  ,a1.[DESCRIPTION] 
  ,pl.[AMOUNT]
  ,pl.[AMOUNT_RECVD]
  ,pl.[TYPE]
  ,ISNULL(t2.[COMM_TYPE],'') AS COMM_TYPE
  ,ISNULL(t2.[REFERENCE],'') AS REFERENCE
  ,ISNULL(t2.[DETAIL],'') AS DETAIL
  ,replace(isnull(convert(varchar, t2.[DATE], 103),''),'01/01/1753','') COMMS_DATE
  ,ISNULL(t2.[CONTACT],'') AS CONTACT
from don0010 pl    
left join DON0001 d1 on pl.[DONOR] = d1.[DONOR]  
left join AREA1 a1 on d1.[AREA1] = a1.[AREA]
outer apply
(
  select top 1 with ties dc.* 
  from doncomms dc
  where dc.DONOR_NO = d1.DONOR_NO and dc.ENTITY = 'C'
  order by dc.DATE desc
) t2

答案 1 :(得分:0)

问题通常在于您有多行DONOR_NO

单独尝试此查询,以查明同一Select DONOR_NO, count(*) from doncomms dc where dc.DATE = (SELECT MAX(DATE) FROM doncomms WHERE DONOR_NO = dc.DONOR_NO) and ENTITY = 'C' GROUP BY DONOR_NO 是否出现过多次

CTE

如果您使用ROW_NUMBER() syntaxis和WITH cte as ( SELECT * FROM ( SELECT *, ROW_NUMBER() OVER(PARTITION BY DONOR_NO ORDER BY DATE DESC) as rn FROM doncomms WHERE ENTITY = 'C' ) T WHERE T.rn = 1 ) select * from don0010 pl left join DON0001 d1 on pl.[DONOR] = d1.[DONOR] left join AREA1 a1 on d1.[AREA1] = a1.[AREA] left join cte as t2 on t2.[DONOR_NO] = d1.[DONOR_NO]

,那么情况会更好
{{1}}

答案 2 :(得分:0)

谢谢Juan,我只需要添加字段名称作为视图运行。

WITH cte as (  
 SELECT *
 FROM (
         SELECT *,
                ROW_NUMBER() OVER(PARTITION BY DONOR_NO ORDER BY DATE DESC) as rn
         FROM doncomms 
         WHERE ENTITY = 'C'
      ) T
 WHERE T.rn = 1
)
select   pl.[PLEDGE_NO]
,d1.[DONOR_NO]
,rtrim(pl.DONOR) DONOR
,d1.[CONTACT_NAME]
,d1.[AREA1]
,a1.[DESCRIPTION] 
,pl.[AMOUNT]
,pl.[AMOUNT_RECVD]
,pl.[TYPE]
,pl.[SOURCE]
,d1.[POST_CODE] as DONOR_POSTCODE   
,replace(isnull(convert(varchar, pl.PLEDGE_DATE, 103),''),'01/01/1753','') PLEDGE_DATE  
,replace(isnull(convert(varchar, pl.[EVENT_DATE], 103),''),'01/01/1753','') EVENT_DATE
,rtrim(pl.DESCRIPTION1) DESCRIPTION1
,rtrim(pl.DESCRIPTION2) DESCRIPTION2
,pl.[COMPLETE]
,pl.[APPLICATION]
,rtrim(pl.COMMENT1) COMMENT1 
,rtrim(pl.COMMENT2) COMMENT2
,pl.[MEMO] 
,ISNULL(t2.[ENTERED_BY] , '') AS ENTERED_BY
,ISNULL(t2.[COMM_TYPE],'') AS COMM_TYPE
,ISNULL(t2.[REFERENCE],'') AS REFERENCE
,ISNULL(t2.[DETAIL],'') AS DETAIL
,replace(isnull(convert(varchar, t2.[DATE], 103),''),'01/01/1753','') COMMS_DATE
,ISNULL(t2.[CONTACT],'') AS CONTACT
from don0010 pl    
left join DON0001 d1 on pl.[DONOR] = d1.[DONOR]  
left join AREA1 a1 on d1.[AREA1] = a1.[AREA]
left join cte as t2
on t2.[DONOR_NO] = d1.[DONOR_NO]