2016-10-30 1 views
0

각 그룹을 생성 모두I 유니언 3 소스 테이블을 가지고있는 시작 번호의 시퀀스 또는 ID

자료 1 :

Id name car 
------------------- 
1 aaa BMW 
1 aaa Porche  
1 aaa Nissan 
2 bbb Nissan 
2 bbb Honda 

소스 2 :

Id name car 
------------------- 
1 aaa Camry 

원본 3 :

Id name car 
--------------------- 
1 aaa Honda 
1 aaa Ford  
2 bbb Buick 

지금 나는 그들 모두를 결합하고 순서가있는 테이블에 삽입하고자합니다. 이 시퀀스에는 각 ID에 대해 반복되는 값이 반복됩니다.

대상 테이블 : 나는 row_number()를 사용해야하고 있지만없는하여 파티션이이 기능을 연합과 순서를 캡처 알고

Id name car sequence 
-------------------------------- 
1 aaa BMW  1 
1 aaa Porche  2 
1 aaa Nissan  3 
1 aaa Camry  4 
1 aaa Honda  5 
1 aaa Ford  6 
2 bbb Nissan  1 
2 bbb Honda  2 
2 bbb Buick  3 

. 그러나, 나는 임시 테이블에 그들을 삽입하고 row_number와 다른 임시 테이블을 만들 수 있습니다, 잘 작동합니다.

열을 row_number()으로 업데이트 할 수 없습니다. 노동 조합과의 직접 접근이 가능한지 또는 대상 테이블을 업데이트 할 수 있는지 알고 싶었습니다.

+0

정말 이와 같은 정보가 저장되어 있습니까? 새 소스가 추가되면 새 테이블을 작성합니까? 소스를 식별 할 수있는 소스 테이블이 하나 있어야합니다. –

답변

1

하지 내가 전적으로 문제를 이해 모르겠지만,이 세 개의 테이블의 결합에 대한 ROW_NUMBER를 사용하여 시퀀스 ID를 선택합니다 :

;WITH ct AS (
    SELECT * 
    FROM (VALUES(1,'aaa','BMW'),(1,'aaa','Porsche'),(2,'bbb','Nissan'),(2,'bbb','Honda')) AS T(id,name,car) 
    UNION ALL 
    SELECT * 
    FROM (VALUES(1,'aaa','Camry')) AS T(id,name,car) 
    UNION ALL 
    SELECT * 
    FROM (VALUES(1,'aaa','Honda'),(2,'bbb','Buick')) AS T(id,name,car) 
) 
SELECT 
    *, 
    rn=ROW_NUMBER() OVER (PARTITION BY name ORDER BY car) 
FROM 
    ct; 

결과 :

╔════╦══════╦═════════╦════╗ 
║ id ║ name ║ car ║ rn ║ 
╠════╬══════╬═════════╬════╣ 
║ 1 ║ aaa ║ BMW  ║ 1 ║ 
║ 1 ║ aaa ║ Camry ║ 2 ║ 
║ 1 ║ aaa ║ Honda ║ 3 ║ 
║ 1 ║ aaa ║ Porsche ║ 4 ║ 
║ 2 ║ bbb ║ Buick ║ 1 ║ 
║ 2 ║ bbb ║ Honda ║ 2 ║ 
║ 2 ║ bbb ║ Nissan ║ 3 ║ 
╚════╩══════╩═════════╩════╝ 
+0

감사 :-). 이것은 나를 위해 일했다 – chits

+0

@chits 환영합니다 =) –

1

간단하고 게으른 방법 보이는대로 : 임시 테이블을 만들고 다음과 같이 날짜를 저장하십시오.

create table #Temp 
(
Id int, 
Name nvarchar(50), 
Car nvarchar(50) 
) 
insert into #Temp select * from Source1 
insert into #Temp select * from Source2 
insert into #Temp select * from Source3 
select ID, Name, Car,ROW_NUMBER() over (partition by Id Order by Id) as sequence from #Temp 
--OR 
--select ID, Name, Car,ROW_NUMBER() over (partition by Id Order by Id) as sequence into #Result from #Temp 
--select * from #Result 
--OR 
--select Id, Name, Car, 
-- Row_Number() over (partition by Id order by Id) as Sequence from 
-- (
--select Id , Name, Car from Source1 union all 
--select Id , Name, Car from Source2 union all 
--select Id , Name, Car from Source3 
--) as Result 
1

테이블 내에 특정 순서의 행이있는 것 같지 않습니다. 결과가 달라질 수 있습니다. 그래서 그것은 간다.

-- Sample data. 
declare @Source1 as Table (Id Int, Name VarChar(3), Car VarChar(10)); 
insert into @Source1 (Id, Name, Car) values 
    (1, 'aaa', 'BMW'), (1, 'aaa', 'Porsche'), (1, 'aaa', 'Nissan'), 
    (2, 'bbb', 'Nissan'), (2, 'bbb', 'Honda'); 
select * from @Source1; 

declare @Source2 as Table (Id Int, Name VarChar(3), Car VarChar(10)); 
insert into @Source2 (Id, Name, Car) values 
    (1, 'aaa', 'Camry'); 
select * from @Source2; 

declare @Source3 as Table (Id Int, Name VarChar(3), Car VarChar(10)); 
insert into @Source3 (Id, Name, Car) values 
    (1, 'aaa', 'Honda'), (1, 'aaa', 'Ford'), (2, 'bbb', 'Buick'); 
select * from @Source3; 

-- Unstable query. 
select Id, Name, Car, 
    Row_Number() over (partition by Id order by TableId) as Sequence 
    from (
    select 1 as TableId, Id, Name, Car from @Source1 union all 
    select 2, Id, Name, Car from @Source2 union all 
    select 3, Id, Name, Car from @Source3) as Edgar