2015-04-23 5 views
2
;WITH CTE AS 
(
Select * From 
     (
     SELECT ROW_NUMBER() OVER(ORDER BY StatusDate) AS SrNo, FirstName 
From Tab1 
    UNION ALL 
    SELECT ROW_NUMBER() OVER(ORDER BY StatusDate) AS SrNo, FirstName 
    From Tab2 
) v 
) 
Select * From CTE 

В любом случае я могу продолжить работу после Row_Number(), сгенерированных в Tab1. Таким образом, если первый результат в UNION закончился на 10000 вторую таблица в UNION должна начинаться с 10001Row_Number() продолжить в запросе союза

Примечания: Я хочу Row_Number(), как он находится внутри Select * From

Таким образом, я не могу не изменить до:

;WITH CTE AS 
(
Select *, ROW_NUMBER() OVER(ORDER BY StatusDate) AS SrNo From 
     (
     SELECT FirstName 
From Tab1 
    UNION ALL 
    SELECT FirstName 
    From Tab2 
) v 
) 
Select * From CTE 

Любая помощь очень ценится.

+0

'UNION' включает в себя отдельный. 'ROW_NUMBER' предотвращает это различие. переместите row_number снаружи или используйте 'UNION ALL' –

+0

Вы или теперь хотите удалить дубликаты? –

+0

@A ツ: Как я уже сказал, я не могу перемещать Row_Number снаружи. Это была опечатка в вопросе. Я исправил это. Теперь это UNION ALL. Я не хочу, чтобы Row_Num повторялся. После использования UNION ALL это то, что происходит. – Jack

ответ

3

Поскольку вы не секционирования данных максимальное row_number должно быть равно количеству строк, чтобы вы могли просто добавить количество строк в tab1 номеру строки в tab2:

;WITH CTE AS 
(
SELECT * FROM 
     (
     SELECT 
      ROW_NUMBER() OVER(ORDER BY StatusDate) AS SrNo, 
      FirstName 
     FROM Tab1 
     UNION ALL 
     SELECT 
      ROW_NUMBER() OVER(ORDER BY StatusDate) + (SELECT COUNT(*) FROM tab1) AS SrNo, 
      FirstName 
     FROM Tab2 
     ) v 
) 
SELECT * FROM CTE 
+0

Выглядит чрезвычайно перспективно. Позвольте мне попробовать :) – Jack

1

Пусть мне думаю, что это то, что вы действительно хотите:

select FirstName 
from tab1 
union all 
select FirstName 
from tab2 
where not exists (select 1 form tab1 t1 where t1.firstname = t2.firstname) 

Тогда вы можете перечислить результаты, как:

select FirstName, row_number() over (order by which, StatusDate) as srNo 
from ((select FirstName, StatusDate, 1 as which 
     from tab1 
    ) union all 
     (select FirstName, StatusDate, 2 as which 
     from tab2 
     where not exists (select 1 form tab1 t1 where t1.firstname = t2.firstname) 
    ) 
    ) f 
+1

Супер. Вы компьютер? Выглядит немного странно, но это работает! – Jack

3

Ваши требования не совсем ясны, но из того, что я могу интерпретировать, это то, что я буду делать.

;WITH UnionedData AS 
(
SELECT FirstName, StatusDate, 10 AS SortOrder 
FROM Tab1 
UNION 
SELECT FirstName, StatusDate, 20 AS SortOrder 
FROM Tab2 
) 
SELECT FirstName, ROW_NUMBER() OVER(ORDER BY SortOrder, StatusDate) AS SrNo 
FROM UnionedData 
+0

Хорошая работа для вас тоже. – Jack

Смежные вопросы