2016-03-01 3 views
-1

Я считаю, что я совершил ошибку новобранец с последним соединением, но я не вижу, что это такое. Код работал до тех пор, пока мне не понадобилось добавлять последнюю запись, записанную в таблице DONCOMMS. (Эта таблица содержит все сообщения для каждого донора). Теперь я получаю 3 повторяющиеся строки для каждой записи из первой таблицы.Ошибка новичков с присоединением

В первоначальном отчете показаны все донорские обязательства от DON0010 и ссылки на описание области и донора из таблиц AREA и DON0001 соответственно. Теперь я хочу узнать последнее сообщение, найденное в DONCOMMS для каждого залога, найденного в DON0010.

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]** 
+2

Какие данные относятся к донкам? Нам нужно что-то большее, чем объяснение 'this doesnt work'. Пожалуйста, прочитайте [** How-to-Ask **] (http://stackoverflow.com/help/how-to-ask) \t \t И вот отличное место для [** START **] (http : //spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/), чтобы узнать, как улучшить качество вопроса и получить лучшие ответы. –

+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 
+0

Спасибо, Иван, однако этот код выводит больше строк (33271), чем в DON0010 (31590) –

+0

@JohnSullivan, что означает, что некоторые строки 'don0010' имеют более одного соответствующего строка в любой из объединенных таблиц. Попробуйте удалить (комментируя) объединенные таблицы из запроса один за другим, чтобы найти проблему. –

+0

К сожалению, это работает до тех пор, пока я не использую _outer apply_ –

0

Проблема обычно у вас есть несколько строк с DATE = MAX(DATE)

Попробуйте этот запрос в одиночку, чтобы узнать, если же 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()

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] 
0

Спасибо, Хуан, мне просто нужно было добавить имена полей для запуска в качестве представления.

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]