amitesh1989 Ответов: 1

Как показать последний статус из таблицы 3


Привет кодер,

Their are three table Reference1, Reference2 and Reference3

<pre lang="text">Reference1

123	pending
234	pending
345	pending
456	pending


Reference2 

345	going
456	going


Reference3

456	Done


Теперь я хочу выйти как

Reference1

123	pending
234	pending
345	going
456	Done


Что я уже пробовал:

Я использую нижеприведенный запрос, но он даст мне

456 сделано

Выберите Reference3.*
Из ссылки 1
JOIN Reference2
ON Reference2. ReferenceNumber = Reference1.ReferenceNumber
Присоединяйтесь Reference3
На Reference3.ReferenceNumber = Reference2.ReferenceNumber

1 Ответов

Рейтинг:
9

Animesh Datta

Привет ,
Сначала я создаю три временные таблицы для объяснения .

create table #tmp1
(
referenceno varchar(10),
statuscode varchar(20),
)
create table #tmp2
(
referenceno varchar(10),
statuscode varchar(20),
)
create table #tmp3
(
referenceno varchar(10),
statuscode varchar(20),
)


--Now insert data 
insert into #tmp1 values('123', 'pending')
insert into #tmp1 values('234', 'pending')
insert into #tmp1 values('345', 'pending')
insert into #tmp1 values('456', 'pending')
insert into #tmp1 values('567', 'pending')
insert into #tmp1 values('678', 'pending')


insert into #tmp2 values('345', 'going')
insert into #tmp2 values('456', 'going')
insert into #tmp2 values('567', 'going')


insert into #tmp3 values('456', 'done')
insert into #tmp3 values('567', 'done')
insert into #tmp3 values('678', 'done')


чтобы получить необходимый ОП, сначала объедините все эти три таблицы .
а затем используйте Row_Number с предложением Partition by, чтобы упорядочить их один за другим по статусу и, наконец, использовать общее табличное выражение для получения требуемого OP .

;with CTE
as
(
select ROW_NUMBER() OVER (partition by referenceno  ORDER BY statuscode) AS RowNumber , *
from 
        (
select * from #tmp1 
union all
select * from #tmp2
union all
select * from #tmp3
)xx)

select referenceno , statuscode from cte  where RowNumber=1

ОПЕРАЦИЯ
referenceno	statuscode
123	pending
234	pending
345	going
456	done
567	done
678	done



Вот еще одно решение, которое может помочь вам без использования CTE
Сначала выберите только те записи из #tmp1 или первой таблицы, которые отсутствуют в двух других таблицах (#tmp2 и #tmp3)
снова выберите только те записи из #tmp2 или второй таблицы, которые отсутствуют в
последняя таблица (#tmp3)
и, наконец, сделайте объединение всех этих наборов записей .
select referenceno , statuscode from #tmp1 where referenceno
not in 
(
select referenceno from #tmp2
union all
select referenceno from #tmp3
)
union all

select referenceno , statuscode  from #tmp2 where referenceno
not in 
(
select referenceno from #tmp3
)
union all
select referenceno , statuscode  from #tmp3

Вот и ОП есть
referenceno	statuscode
123	pending
234	pending
345	going
456	done
567	done
678	done


Спасибо


amitesh1989

Большое спасибо за вашу помощь можете ли вы сказать как и где мы используем CTE

Animesh Datta

Рад вам помочь .
Пожалуйста, проверьте ссылку ниже
http://www.codeproject.com/Articles/265371/Common-Table-Expressions-CTE-in-SQL-SERVER

Karthik_Mahalingam

5 за ваши усилия

Animesh Datta

Спасибо

amitesh1989

спасибо Анимеш

Animesh Datta

:)