2016-10-30 24 views
0

的我有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 

Now我想把它們全部結合起來,並插入一個序列表中。該序列將爲每個ID重複增量值。

目標表:

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創建另一個臨時表,它工作正常。

我也無法更新與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 
相關問題