我有3个源表,必须将它们全部联合起来
来源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重复增量值。
目标表:
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()
和分区,但无法使用此函数捕获Union的序列。但是,我可以将它们插入临时表并使用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 ║
╚════╩══════╩═════════╩════╝
答案 1 :(得分: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
答案 2 :(得分: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